【问题标题】:How to chop off part of a file extension using find -exec如何使用 find -exec 删除部分文件扩展名
【发布时间】:2015-04-17 16:17:39
【问题描述】:

我想使用“查找”来重命名一堆文件,重命名只是删除部分扩展名。 例子: abc.ext.DELAYED --> abc.ext

我尝试了以下方法,但它们根本不起作用:

find . -name *.DELAYED -execdir mv {} $(echo {} | sed 's:\.DELAYED::') \;
find . -name *.DELAYED -execdir mv {} $(echo {} | cut -f 1 -d".") \;

【问题讨论】:

    标签: linux find exec


    【解决方案1】:

    你的命令有两个问题。

    第一个问题是命令中的*。您需要将其括在一个字符串中,否则 bash 会将其扩展为一个 glob 表达式 - * 会扩展为当前文件夹中的所有文件。

    该命令应如下所示:

    find . -name '*.DELAYED' ...
    

    第二个问题是命令替换发生在之前命令被执行的意义

    $(echo {})
    

    将扩展为文字 {} 将导致类似的命令

    mv file1 file1
    

    您可以改为在 shell 中执行命令:

    ... -execdir bash -c 'mv {} $(echo {} | cut -f2 -d.)' \;
    

    【讨论】:

    • 这是一回事。但是还有另一个问题——命令替换是在命令运行之前完成的。
    【解决方案2】:

    你已经用“linux”专门标记了这个问题,所以我假设你的发行版安装了重命名工具,它捆绑在 util-linux 包中。

    这避免了命令替换问题和链接多个程序:

    find . -name '*.DELAYED' -execdir rename .DELAYED '' {} \;
    

    【讨论】:

    • 是的,使用rename 比命令替换构造好得多。
    猜你喜欢
    • 2019-08-10
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2017-06-07
    相关资源
    最近更新 更多