Linux命令模糊重定向

时间:2013-02-08 05:19:41

标签: linux bash

您好我有一个名为header.txt的实验室标题,我想要进入我的3 C文件 cat ../header.txt > find -name *.c

上述陈述有什么问题?

3 个答案:

答案 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的文件说谎周围,​​它不包含任何重要的东西),你会处理中断等,并清理中间文件。您可以考虑使用mvcp替换原始文件是否更好 - 再次考虑权限,符号链接,硬链接和清理。