Linux命令模糊redirect

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

上述说法有甚么错误?

I / O重定向操作符<>等全部只取一个字作为它们的参数,并将其用作文件名 。 其他任何东西都被认为是命令行的一部分。

所以当你运行这个:

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

这完全一样:

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

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

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


你可以做你似乎想要的tee ,它接受任何数量的参数:

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

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

 tee *.c < ../header.txt 

当然,你也可以用cp做这个。 也许你打算附加到这些文件? 如果是这样,通过-atee


有趣的琐事:zsh和其他一些shell会让你有多个 >运算符,就像tee一样工作。 (多<也是允许的, cat 。)

 cat infile > outfile1 > outfile2 

但是你必须单独列出每个文件,所以你不能使用这个快捷方式,像*.c这样的*.c

您可以使用以下命令将C文件与实验室标题前缀相加:

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

如果这将是一个生产操作,你会担心使用一个唯一的文件名作为临时(我只是假设,如果你不小心有一个名为x的文件躺在周围,它不包含任何重要的东西),你会处理中断等,并清理中间文件。 你可以冥想用mv还是cp来代替原始文件 – 思考权限,符号链接,硬链接和清理。

输出重定向用于文件,而不是命令。 您需要分别处理每个文件。

 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 $