如何在 bash 中使用带有 -exec 的 'cat' 命令?

How to use 'cat' command with -exec in bash?

我搜索了一些文件,我想用其他文件中的新内容替换旧内容,所以我有

#!/bin/bash
find /home/old -path "*" -exec cat /home/new/ > {} \;

当我执行时:

> sh find.sh 'blam.php'

问题是脚本在与 find.sh

相同的目录中创建一个名为 {} 的文件

这里的问题是 > {} 而不是 find 命令的一部分。该脚本首先由 shell 解释,> 的含义由 shell 处理,然后将其周围的内容作为参数传递给执行:

$ set -- blam.php
$ set -x
$ find /home/old -path "*" -exec cat "/home/new/" > {} \;
+ find /home/old -path '*blam.php' -exec cat /home/new/blam.php ';'

如果您想要在其他地方复制您的文件,

你得到的问题是 > 是 shell 语法的一部分,对于 find 命令和 exec 命令中的语法应该是文字。

您尝试做的事情可以分两步完成

  • 正在生成脚本
  • 正在执行脚本

.

find /home/old -path "*" -printf 'cat /home/new/'""' > %p\n' > script.sh
sh script.sh

这种方式允许检查命令,或者使用管道

find /home/old -path "*" -printf 'cat /home/new/'""' > %p\n' | sh

另一种效率较低的方法,因为每个文件 shell spwans

find /home/old -path "*" -exec sh -c 'cat "/home/new/" > {}' _ "" \;