以下のようなことを行うコードをどなたか教えてください。 あるディレクトリにファイルがあり、そのすべてをプログラムで実行する必要があるとします。プログラムはその結果を標準出力します。私は、ディレクトリに入り、各ファイルに対してコマンドを実行し、出力を1つの大きな出力ファイルにまとめるスクリプトが必要です。
例えば、1つのファイルに対してコマンドを実行するには、次のようにします。
$ cmd [option] [filename] > results.out
次のbashコードは、$fileをコマンドに渡します。$fileは/dir内のすべてのファイルを表します。
for file in /dir/*
do
cmd [option] "$file" >> results.out
done
例
el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
どうでしょう。
find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out
-maxdepth 1` 引数は、find が任意のサブディレクトリに再帰的に降下するのを防ぎます。 サブディレクトリに再帰的に降りることを防ぎます。 (そのようなネストしたディレクトリを処理したい場合には、これを省略することができます)。
-exec cmd option {}
は、見つかったファイルごとに、指定された option
で cmd
を実行することを指示します。cmd
の実行結果の出力はすべて
rresults.out` にリダイレクトされます。しかし,ファイルの処理順序が気になる場合は,ループを書いたほうがよいでしょう。 ループを書いたほうがいいかもしれません。 find`はファイルをinode順に処理すると思います。 inode順に処理すると思いますが(間違っているかもしれませんが)、これはあなたが望むものではないかもしれません。 あなたが望むものではないかもしれません。
Jim Lewis氏のアプローチに基づいています。
ここでは、find
を使って、ファイルを修正日順に並べるという簡単な方法を紹介します。
$ find directory/ -maxdepth 1 -type f -print0 | \
xargs -r0 stat -c "%y %n" | \
sort | cut -d' ' -f4- | \
xargs -d "\n" -I{} cmd -op1 {}
ソートについては
http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time