您好我有一个名为header.txt的实验室标题,我想要进入我的3 C文件
cat ../header.txt > find -name *.c
上述陈述有什么问题?
答案 0 :(得分: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
执行此操作。也许您打算追加这些文件?如果是这样,请将-a
传递给tee
。
有趣的琐事:zsh和其他一些shell会让你拥有多个 >
运算符,就像tee
一样。 (也允许多个<
,其作用类似于cat
。)
cat infile > outfile1 > outfile2
但是你必须单独列出每个文件,所以你不能使用像*.c
这样的全局快捷方式。
答案 1 :(得分: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
$
答案 2 :(得分:0)
您可以使用以下命令为C文件添加实验室标题:
for file in *.c
do cat ../header.txt "$file" > x
mv x "$file"
done
如果这将是一个生产操作,你会担心使用一个唯一的文件名作为临时文件(我只是假设如果你不小心有一个名为x
的文件说谎周围,它不包含任何重要的东西),你会处理中断等,并清理中间文件。您可以考虑使用mv
或cp
替换原始文件是否更好 - 再次考虑权限,符号链接,硬链接和清理。