一致するすべてのファイル名パターンに対してコマンドを実行する

一致するすべてのファイル名パターンに対してコマンドを実行する

ファイル名を変数として名前パターンとして指定するコマンドがあります。file_*_123.txt

Script.sh file_*_123.txt

これで、一致するパターンを持つ複数のファイルがある場合は、最初のファイルに対してのみ実行されるので、名前パターンと一致するすべてのファイルに対してこのスクリプトを実行したいと思います。例えば file_1_123.txt, file_2_123.txt, file_3_123.txt

一種のforループです。しかし、ファイル数が1つ以上である可能性があるので、繰り返し方法がわかりません。

誰でも解決策を提案できますか?

答え1

これには、ループ内でスクリプトを呼び出すか、スクリプトがコマンドライン引数を繰り返すように配置することが含まれます。

最初のオプション:

for filename in file_*_123.txt; do
    ./Script.sh "$filename"
done

これにより、パターンに一致する各ファイルに対して一度スクリプトが呼び出されますfile_*_123.txt

2番目のオプション:

スクリプトを変更して本文をループにラップできます。

#!/bin/sh

for filename do
    # here you do whatever you need to do with "$filename"
done

または、

#!/bin/sh

for filename in "$@"; do
    # here you do whatever you need to do with "$filename"
done

(ループの2つの変形は同じです)

これにより、スクリプトはコマンドライン引数を繰り返します。次に、質問に示すようにスクリプトを実行します。

./Script.sh file_*_123.txt

答え2

一致するファイルを並列に実行するには、ユーティリティの使用を検討できます。平行線

コード例

funcXXXX(){
    file_path="${1}"
    /PATH/Script.sh "${file_path}"
}

# make function funcXXXX can be used by parallel
export -f funcXXXX

ls /PATH/file_*_123.txt | xargs -l | parallel -k -j 0 funcXXXX

関連情報