嗨,我有一个名为 header.txt 的实验室标头,我想将 cat 放入我的 3 C 文件中
cat ../header.txt > find -name *.c
上述说法有什么问题?
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
. 也许您打算附加到这些文件?如果是这样,也传递-a
给tee
。
有趣的琐事:zsh 和其他一些 shell 将让您拥有多个 >
运算符,就像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
并且 glob*.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
替换原始文件是否更好- 再次考虑权限、符号链接、硬链接和清理。