特定のエンディングを持つすべてのファイルを含むテキストファイルを生成するbashスクリプト

特定のエンディングを持つすべてのファイルを含むテキストファイルを生成するbashスクリプト

私はこれが初歩的な質問であることを知っています。しかし、誰かがこれについて短い答えをするかもしれません。私のフォルダには、.で終わるが別のエンディングで終わるいくつかのファイルがあります.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を使用したいと思います。ただし、ファイルにファイル名を追加するいくつかの方法は次のとおりです。

  1. 単純ですが、ファイル名の改行を処理できません。

    printf '%s\n' *.SAFE > filenames.txt
    
  2. より複雑ですが、任意のファイル名を処理できます。

    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完了です。

関連情報