sed在find的“exec”里面没有正常工作

时间:2017-03-16 21:31:50

标签: unix sed replace find 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”的一部分时,它为什么不起作用?

1 个答案:

答案 0 :(得分:1)

不支持您尝试做的事情。在manfind部分PRIMARIES的{​​{1}}页面中,它指出:

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

但是,您可以使用-execfind命令生成饲料,以创建可以导入sed的命令流。然后,您可以通过从管道中删除bash进行故障排除:

bash

第一个find . -type f -name '*.txt' | sed 's/.*/mv & &/; s/\.txt$//' | bash -x sed命令创建一个s字符串,两个文件名相同,第二个mv命令从第二个s中删除.txt

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