0

こんにちは、header.txt というラボ ヘッダーがあり、3 つの C ファイルにアクセスしたいと考えています。 cat ../header.txt > find -name *.c

上記のステートメントのどこが間違っていますか?

4

3 に答える 3

3

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

于 2013-02-08T06:15:35.220 に答える
0

出力のリダイレクトは、コマンドではなくファイル用です。各ファイルを個別に処理する必要があります。

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
$
于 2013-02-08T05:28:29.597 に答える
0

以下を使用して、ラボのヘッダーを C ファイルの前に付けることができます。

for file in *.c
do cat ../header.txt "$file" > x
   mv x "$file"
done

これが本番操作になる場合は、一時ファイルとして一意のファイル名を使用することを心配するでしょう (不注意でファイルという名前のファイルがx横たわっている場合、そこには何も含まれていないと思います)。重要)、割り込みなどを処理し、中間ファイルをクリーンアップします。mv元のファイルを使用するのが良いのか、元のファイルを置き換えるのが良いのかを熟考することができcpます — アクセス権、シンボリック リンク、ハード リンク、およびクリーンアップをもう一度熟考してください。

于 2013-02-08T06:09:09.893 に答える