sed 在 find 中无法正常工作 "exec"

sed not working properly inside find's "exec"

我正在使用单行工具删除某个位置中大量文件的扩展名。

这就是它的样子,它应该可以工作,但它没有:

find . -type f -name '*.txt' -exec mv {} $( echo {} | sed 's/\.txt//g'  )  \;

替换从未发生。 "mv" 表示:

mv: \`./partaa.txt' and `./partaa.txt' are the same file

我知道问题出在这里:

$( echo {} | sed 's/\.txt//g'  )

但是如果我尝试这样的事情,它会完美地工作:

echo $( echo "partaa.txt" | sed 's/.txt//g' )

为什么当它是 "exec" 的一部分时它不起作用?

不支持您尝试执行的操作。在 -execPRIMARIES 部分的 findman 页面中,它指出:

实用程序和参数不受 shell 模式和构造的进一步扩展。

但是,您可以使用 findsed 命令生成饲料,创建一个命令流,您可以将其通过管道传输到 bash。然后您可以通过从管道中删除 bash 来进行故障排除:

find . -type f -name '*.txt' | sed 's/.*/mv & &/; s/\.txt$//' | bash -x

第一个 sed s 命令创建两个文件名相同的 mv 字符串,第二个 s 命令从第二个中删除 .txt一.

'-x' 告诉 bash 在执行时显示每个命令。您可以放心地省略它。