誰かが次のことを行うためのコードを提供してくれませんか: ファイルのディレクトリがあり、そのすべてをプログラムで実行する必要があるとします。プログラムは結果を標準出力に出力します。ディレクトリに入り、各ファイルでコマンドを実行し、出力を 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がサブディレクトリに再帰的に下降するのを防ぎます。(このようなネストされたディレクトリを処理する場合は、これを省略できます。)-type -f
プレーンファイルのみが処理されることを指定します。-exec cmd option {}
見つかったファイルごとcmd
に指定されたファイル名で実行するように指示します。option
{}
\;
コマンドの終了を示します。cmd
実行からの出力はにリダイレクトされ
ますresults.out
ただし、ファイルが処理される順序を気にする場合は、ループを作成する方がよい場合があります。私find
はファイルをiノードの順序で処理すると思います(私はそれについて間違っているかもしれませんが)、それはあなたが望むものではないかもしれません。
コマンドラインからRaspberry Riでこれを実行するには、次を実行します。
for i in *; do cmd "$i"; done
@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
すべての .md ファイルを 1 つのディレクトリから別のディレクトリにコピーする必要があったため、次のようにしました。
for i in **/*.md;do mkdir -p ../docs/"$i" && rm -r ../docs/"$i" && cp "$i" "../docs/$i" && echo "$i -> ../docs/$i"; done
これはかなり読みにくいので、分解してみましょう。
最初に、ファイルのあるディレクトリに cd し、
for i in **/*.md;
パターン内の各ファイルに対して
mkdir -p ../docs/"$i"
ファイルを含むフォルダーの外の docs フォルダーにそのディレクトリを作成します。そのファイルと同じ名前の追加のフォルダーを作成します。
rm -r ../docs/"$i"
結果として作成された余分なフォルダーを削除しますmkdir -p
cp "$i" "../docs/$i"
実際のファイルをコピーする
echo "$i -> ../docs/$i"
あなたがしたことを反響させる
; done
末永く幸せに過ごす
簡単な解決策は次のとおりだと思います。
sh /dir/* > ./result.txt