私がすることができます:
$ find .
.
./b
./b/foo
./c
./c/foo
この:
$ find . -type f -exec cat {} \;
This is in b.
This is in c.
しかし、これではありません:
$ find . -type f -exec cat > out.txt {} \;
なぜだめですか?
私がすることができます:
$ find .
.
./b
./b/foo
./c
./c/foo
この:
$ find . -type f -exec cat {} \;
This is in b.
This is in c.
しかし、これではありません:
$ find . -type f -exec cat > out.txt {} \;
なぜだめですか?
find の -exec 引数は、ファイルが見つかるたびに、指定したコマンドを 1 回実行します。試す:
$ find . -type f -exec cat {} \; > out.txt
また:
$ find . -type f | xargs cat > out.txt
xargs は、その標準入力を、指定したコマンドのコマンド ライン引数に変換します。ファイル名にスペースが含まれていることが心配な場合は、次を試してください。
$ find . -type f -print0 | xargs -0 cat > out.txt
うーん...現在のディレクトリにout.txtを出力すると、findが再帰しているようです
次のようなものを試してください
find . -type f -exec cat {} \; > ../out.txt
次のようなことができます:
$ cat `find . -type f` > out.txt
すべてのファイルを 1 つの大きなファイルに cat するだけなので、 find の出力をファイルにリダイレクトするだけではどうですか。
find . -type f -exec cat {} \; > /tmp/out.txt
>おそらく、他の応答から、 find が引数として取得する前にシンボルがシェルによって解釈されると推測したことでしょう。しかし、「そうしない理由」に答えるために、次のコマンドを見てみましょう。
$ find . -type f -exec cat > out.txt {} \;
したがって、findこれらの引数を指定"." "-type" "f" "-exec" "cat"しています: リダイレクトにこれらの引数を指定しています:"out.txt" "{}"および";". これは、セミコロンで引数をfind終了せず、ファイル名を引数 ("{}") として使用しないことで混乱を招き、リダイレクトも混乱させる可能性があります。-exec
他の提案を見ると、見つけたのと同じディレクトリに出力を作成することは本当に避けるべきです。しかし、それらはそれを念頭に置いて動作します。そして、この-print0 | xargs -0組み合わせは非常に便利です。あなたが入力したかったのは、おそらく次のようなものでした:
$ find . -type f -exec cat \{} \; > /tmp/out.txt
サブディレクトリが 1 レベルしかなく、通常のファイルしかない場合は、次のようなばかげた単純なことを行うことができます。
cat `ls -p|sed 's/\/$/\/*/'` > /tmp/out.txt
ディレクトリにls追加するすべてのファイルとディレクトリを一覧表示'/'し、ディレクトリにseda を追加します'*'。次に、シェルはこのリストを解釈し、グロブを展開します。シェルが処理するファイルが多すぎない場合、これらはすべて引数として cat に渡され、出力は out.txt に書き込まれます。
bashであなたはすることができます
cat $(find . -type f) > out.txt
$()を使用すると、コマンドから出力を取得して別のコマンドに渡すことができます
これを試して:
(find . -type f -exec cat {} \;) > out.txt
または、本当に優れた Z シェル ( ) を使用している場合は役に立たない検索を省略して、zshこれを行うことができます。
setopt extendedglob
(これはあなたの中にあるはずです.zshrc)次に:
cat **/*(.) > outfile
ただ動作します:-)