【问题标题】:sed not working properly inside find's "exec"sed 在 find 的“exec”中无法正常工作
【发布时间】:2017-08-08 06:44:23
【问题描述】:

我正在开发一个单行程序来删除某个位置的大量文件的扩展名。

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

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”的一部分时它不起作用?

【问题讨论】:

    标签: unix sed replace find exec


    【解决方案1】:

    不支持您尝试执行的操作。在findman 页面中PRIMARIES 部分的-exec 下,它声明:

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

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

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

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

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

    【讨论】:

    • 非常感谢@Greg Tarsa。 :) 这就像魅力一样。关于我上面的问题,所以我的问题是引用对吗?你知道我引用错了什么吗?
    • 我不得不承认我没有。我记得几年前花了一两个小时试图让-exec 做类似的事情,最后开始创建一组 bash 命令并且从未回头。但是,在重新阅读 find 手册页时,我发现了一个可能完全阻止该解决方案的限制。我已更新我的答案以包含它。
    • 如果这个答案是正确的,请标记它。谢谢!
    • 我已经这样做了。非常感谢你所有的帮助伙伴。 :)
    • 很高兴,我很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多