![多くのファイルのバッチ処理 [閉じる]](https://linux33.com/image/116925/%E5%A4%9A%E3%81%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
先頭に「@」を含むすべての行が必要な別のリストがたくさんあります。現在ファイルを処理するために使用していますsh list_of_commands
。これを行うより賢い方法があるかどうか疑問に思います。
1)すべてのコマンドラインを1つずつ作成せずにすべてのファイルを一括処理する方法は?
2)入力ファイル名にサフィックスを追加して出力ファイル名を指定する方法はありますか?
とても感謝しています!
答え1
次のスクリプトは、スクリプトが実行されているディレクトリ内のすべてのファイルをクロールし、そのファイルに1つずつコマンドを適用します。それはあなたが望むものですか?
#! /bin/sh
for file in *
do
if [[ -f "$file" ]]; then
# process the file with name in "$file" here
fi
done
上記のループでは、次のステートメントを使用して要求に応じてファイル名を変更できます。
mv "$file" "$(echo" $file" | sed -n "s|^\(.*\)\(\.[0-9a-zA-Z]*\)$|\1_su\2|p")"
ファイル拡張子サフィックスの前に、ファイル名の末尾にサフィックス "_su"を置きます。ファイルに拡張子がない場合は、ファイル名の末尾にサフィックスが付きます。
答え2
- スクリプトからのコマンドの収集(下記参照)
- スクリプトコマンドラインで指定されたファイル名にサフィックスを追加し、それを出力ファイル名として使用します。
#!/bin/sh
for name in "$@"; do
some_utility "$name" >"$name.suffix"
done
"$@"
コマンドラインで参照されるコンテンツのリストに展開されます。例えば、
$ ./script.sh a b "hello world" 123
この変数はループの連続反復で、および$name
値を使用します。この方法で入力ファイルを渡すことができます。a
b
hello world
123
$ ./script.sh input*.txt
これにより、指定されたパターンに一致する現在のディレクトリ内のすべてのファイルが提供されます。
その後、この変数を$name
各入力ファイルの名前として使用し、値の末尾に単にタグを付けてサフィックスを追加できます(出力ファイルの名前として使用など)。
ループ内の行を実際にファイルを処理する行に置き換えます$name
。
これを行う./script.sh
ために使用されますchmod +x script.sh
。