bash - 了解管道和重定向命令

标签 bash pipe

我想了解管道和重定向命令的真正威力。据我了解,| 将一个命令结果的输出作为自身的输入。而且,> 有助于输出重定向。如果是这样,

find . -name "*.swp" | rm 
find . -name "*.swp" > rm 

为什么这个命令没有按预期工作。对我来说上面的命令意味着

  1. 递归查找当前目录下所有扩展名为.swp的文件。
  2. 获取 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/

相关文章:

linux - 在所有启动过程后运行我的应用程序

shell - 我可以获取一个输出流,用 tee 复制它,复制其中一个,然后将两者作为输入返回到 diff 中吗?

python - 在 Linux 上重定向 `stdin`?还是我做错了?

bash - shell脚本中是否有任何互斥/信号量机制?

bash - sed 在单个命令中交换单词

linux - 将 awk 变量传递给 bash 脚本

bash - 使程序在文件更改时重新加载已打开的文件

bash - 带有管道的变量中的命令

python - 如何从 Windows 上的 Gstreamer 子进程读取二进制数据?

Java无法读取写入标准输出的有符号负字节