ファイル名を変数として名前パターンとして指定するコマンドがあります。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