0

嗨,我有一个名为 header.txt 的实验室标头,我想将 cat 放入我的 3 C 文件中 cat ../header.txt > find -name *.c

上述说法有什么问题?

4

3 回答 3

3

I/O 重定向操作符<,>等等都只使用一个单词作为参数,并将其用作文件名。其他任何内容都被视为命令行的一部分。

所以当你运行这个时:

cat ../header.txt > find -name *.c

它与此完全相同:

cat ../header.txt -name *.c > find

这可能不会做任何有用的事情。

另一个问题:你*.c没有被转义或引用,所以 bash 会扩展它而不是将它传递给find.


你可以做你想做的事tee,它接受任意数量的参数:

cat ../header.txt | tee *.c

然后你甚至不需要cat更多了,真的。

tee *.c < ../header.txt

当然,您也可以使用cp. 也许您打算附加到这些文件?如果是这样,也传递-atee


有趣的琐事:zsh 和其他一些 shell 将让您拥有多个 >运算符,就像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

并且 glob*.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 回答