我正在使用单线程删除某个位置的大量文件的扩展名。
这就是它的样子,它应该有效,但它没有:
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”的一部分时,它为什么不起作用?
答案 0 :(得分:1)
不支持您尝试做的事情。在man
下find
部分PRIMARIES
的{{1}}页面中,它指出:
实用程序和参数不受shell模式和结构的进一步扩展的影响。
但是,您可以使用-exec
为find
命令生成饲料,以创建可以导入sed
的命令流。然后,您可以通过从管道中删除bash
进行故障排除:
bash
第一个find . -type f -name '*.txt' | sed 's/.*/mv & &/; s/\.txt$//' | bash -x
sed
命令创建一个s
字符串,两个文件名相同,第二个mv
命令从第二个s
中删除.txt
。
' -x'告诉bash在执行时显示每个命令。你可以放心地省略它。