我想了解管道和重定向命令的真正威力。据我了解,|
将一个命令结果的输出作为自身的输入。而且,>
有助于输出重定向。如果是这样,
find . -name "*.swp" | rm
find . -name "*.swp" > rm
为什么这个命令没有按预期工作。对我来说上面的命令意味着
- 递归查找当前目录下所有扩展名为.swp的文件。
- 获取
1.
的输出并删除所有结果文件。
仅供引用,是的,我知道如何完成这项任务。可以通过传递 -exec
标志来完成。
find . -name "*.swp"-exec rm -rf {} \;
但正如我已经提到的,我想用 >
或 |
命令来完成它。
如果我错了并且方向错误,请纠正我并解释重定向和管道命令。我们在哪里使用谁的命令?请不要提及我读过的所有书籍的简单示例。试着向我解释一些复杂的事情。
最佳答案
我将通过您展示的三种方法对此进行分解:
>
会将所有来自find
的输出重定向到一个名为rm
的文件中(不会起作用,因为您只是附加到一个文件).|
会将find
的输出通过管道传输到rm
命令(不会工作,因为rm
不在stdin
上阅读)-exec rm -rf {}\;
将对找到的每个项目 (
找到(将起作用,因为它将文件作为参数传递给{}
) 运行rm -rf
rm
)。
您需要使用 -exec
标志,或通过管道输入 xargs
命令(man xargs
),而不是 |
或 >
以实现所需的行为。
编辑: 正如@dmckee 所说,您还可以使用 $()
运算符进行字符串插值,即:rm -rf $(find . - name "*.swp")
(如果您有大量文件,由于参数长度限制,这将失败)。
关于bash - 了解管道和重定向命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12394426/