私はこれが初歩的な質問であることを知っています。しかし、誰かがこれについて短い答えをするかもしれません。私のフォルダには、.で終わるが別のエンディングで終わるいくつかのファイルがあります.SAFE
。各行がこれらのファイルの1つであるファイルを作成したいと思います.txt
。後で.txt
そのファイルを入力として使用するプログラムを実行したいと思います。私は1つのbashスクリプトでこれをすべてやりたいと思います。やや次のようになります。
programm.sh
####
1. get all files with .SAFE-ending
2. make a file called files.txt
3. run <some_program>
私のフォルダは次のとおりです
files.txt
S2A_MSIL1C_20200418T101031_N0209_R022_T32UPB_20200418T122607.SAFE
S2A_MSIL1C_20200418T101031_N0209_R022_T32UQB_20200418T122607.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T111956.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T122440.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T111956.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T122440.SAFE
S2A_MSIL1C_20200424T103021_N0209_R108_T32UPB_20200424T124310.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UPB_20200428T111417.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UQB_20200428T111417.SAFE
S2A_MSIL2A_20200418T101031_N9999_R022_T32UPB_20200430T165258.SAFE
それは次のようになりますfiles.txt
:(Pythonで私が作ったもの)
2A_MSIL1C_20200418T101031_N0209_R022_T32UPB_20200418T122607.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T122440.SAFE
S2B_MSIL1C_20200426T101549_N0209_R065_T32UPB_20200426T131809.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T111956.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T111956.SAFE
S2B_MSIL1C_20200423T100549_N0209_R022_T32UQB_20200423T135558.SAFE
S2B_MSIL1C_20200423T100549_N0209_R022_T32UPB_20200423T135558.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UQB_20200428T111417.SAFE
S2B_MSIL1C_20200426T101549_N0209_R065_T32UQB_20200426T131809.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T122440.SAFE
S2A_MSIL1C_20200424T103021_N0209_R108_T32UPB_20200424T124310.SAFE
S2B_MSIL1C_20200419T102549_N0209_R108_T32UPB_20200419T124956.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UPB_20200428T111417.SAFE
S2A_MSIL1C_20200418T101031_N0209_R022_T32UQB_20200418T122607.SAFE
次に、parallel -j4 <some_programm> :::: files.txt
コマンドラインから実行します。
これはすべてうまくいきますが、すべてを1つにまとめたいのですbash script
。一つの理由は、シェルスクリプトを学びたいからです。
どんなアドバイスにも感謝します:)
答え1
parallel
で終わるすべてのファイルに対してコマンドを使用して実行するには、.SAFE
次のものが必要です。
parallel -j4 <some_program> ::: *.SAFE
または、ファイル名にを含めることができる場合は、以下を\n
使用してください-0
。
parallel -j4 -0 <some_program> ::: *.SAFE
ファイル名をファイルに保存するのは良いアプローチではありません。まず、ファイル名に\n
(改行)文字を含めることができる場合、ファイルをスペースで区切らないとファイル名が壊れます。通常、代わりにglobを使用したいと思います。ただし、ファイルにファイル名を追加するいくつかの方法は次のとおりです。
単純ですが、ファイル名の改行を処理できません。
printf '%s\n' *.SAFE > filenames.txt
より複雑ですが、任意のファイル名を処理できます。
find . -type f -name '*.SAFE' -print0 > filenames
これにより、NULLで区切られたファイルが生成されるため、これらの入力を処理するためのツールが必要です。
parallel
あなたはこれを行うことができます-0
:parallel -0 -j4 <some_program> :::: filenames
したがって、このアプローチでは、スクリプトは次のようになります。
#!/bin/sh
find . -type f -name '*.SAFE' -print0 > filenames
parallel -0 -j4 <some_program> :::: filenames
ただし、ファイル名にスペース、改行、その他の奇妙な文字が含まれていない場合は、実行するだけでparallel -j4 -0 <some_program> ::: *.SAFE
完了です。