こんにちは、header.txt というラボ ヘッダーがあり、3 つの C ファイルにアクセスしたいと考えています。
cat ../header.txt > find -name *.c
上記のステートメントのどこが間違っていますか?
I/O リダイレクション演算子<
、>
などはすべて、引数として1 つの単語のみを取り、それをファイル名として使用します。それ以外は、コマンド ラインの一部と見なされます。
したがって、これを実行すると:
cat ../header.txt > find -name *.c
これとまったく同じです:
cat ../header.txt -name *.c > find
それはおそらく何の役にも立たないでしょう。
別の問題: your*.c
はエスケープまたは引用符で囲まれていないため、bash は に渡すのではなく展開しfind
ます。
tee
任意の数の引数を受け入れる を使用して、必要に応じて実行できます。
cat ../header.txt | tee *.c
そして、もう必要ありcat
ません。
tee *.c < ../header.txt
もちろん、これを で行うこともできますcp
。おそらく、これらのファイルに追加するつもりでしたか? もしそうなら、同様に渡し-a
てください。tee
興味深いトリビア: zsh やその他のシェルでは、複数の >
演算子を使用できますtee
。(複数<
も許可され、 のように機能しcat
ます。)
cat infile > outfile1 > outfile2
ただし、実際にはすべてのファイルを個別にリストする必要があるため、このショートカットを のようなグロブで使用することはできません*.c
。
出力のリダイレクトは、コマンドではなくファイル用です。各ファイルを個別に処理する必要があります。
find -name *.c -print0 | while IFS= read -r -d '' f; do
cat ../header.txt >> $f # Append instead of overwriting
done
「あいまいなリダイレクト」に関しては、通常、次のように書くとそれが得られます。
... > *.c
グロブ*.c
は複数のファイルに展開されます。例えば:
$ echo "" >> *.c
-sh: *.c: ambiguous redirect
$
以下を使用して、ラボのヘッダーを C ファイルの前に付けることができます。
for file in *.c
do cat ../header.txt "$file" > x
mv x "$file"
done
これが本番操作になる場合は、一時ファイルとして一意のファイル名を使用することを心配するでしょう (不注意でファイルという名前のファイルがx
横たわっている場合、そこには何も含まれていないと思います)。重要)、割り込みなどを処理し、中間ファイルをクリーンアップします。mv
元のファイルを使用するのが良いのか、元のファイルを置き換えるのが良いのかを熟考することができcp
ます — アクセス権、シンボリック リンク、ハード リンク、およびクリーンアップをもう一度熟考してください。