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