【问题标题】:How do I rename files found with the find command如何重命名使用 find 命令找到的文件
【发布时间】:2019-09-02 17:05:17
【问题描述】:

我有一系列音乐文件夹。一些文件名包含我想去掉的下划线。

find /Users/Chris/CDs -type f -name "*_*" 

我找到所有带下划线的文件。 看来我可以将-execdir mv {} 添加到命令中,但不知道从那里添加什么。 我认为{} 提供完整路径和文件名作为带有下划线的文件字符串,但我不知道如何使用sed 's/_//g' 之类的东西来删除新文件名上的_。 任何帮助将不胜感激。

【问题讨论】:

    标签: bash find renaming


    【解决方案1】:

    试试:

    find /Users/Chris/CDs -type f -name "*_*" -execdir bash -c 'mv -i -- "$1" "${1//_/}"' Mover  {} \;
    

    它是如何工作的:

    • -execdir bash -c '...' Mover {} \;

      这会启动 bash 并告诉它在单引号中运行命令,其中 Mover 分配给 $0,文件名分配给 $1

    • mv -i -- "$1" "${1//_/}"

      这将重命名文件$1。这使用 bash 的参数扩展功能 ${1//_/},通过删除所有下划线从 $1 创建目标名称。

      -i 选项告诉mv 在覆盖文件之前以交互方式询问。

      选项-- 告诉mv 没有更多选项。这是必需的,以便正确处理名称以 - 开头的文件。

    示例

    让我们从包含这些文件的目录开始:

    $ ls
    1_2_3_4  a_b  c_d
    

    接下来我们运行我们的命令:

    $ find . -type f -name "*_*" -execdir bash -c 'mv -i -- "$1" "${1//_}"' Mover  {} \;
    

    命令完成后,文件为:

    $ ls
    1234  ab  cd
    

    $0的目的

    在我们添加错误的地方观察这个命令:

    $ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "$1" "${1//_}"' Mover  {} \;
    Mover: foobar: command not found
    

    请注意,Mover 出现在错误消息的开头。这表明错误来自bash -c 命令。

    如果我们将Mover 替换为-,我们会看到:

    $ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "$1" "${1//_}"' -  {} \;
    -: foobar: command not found
    

    在终端中运行单个命令时,错误的来源可能仍然很明显。但是,如果此 find 命令被隐藏在一个长脚本中,那么使用更具描述性的 $0,例如 Mover 或其他,可能会有很大帮助。

    【讨论】:

    • 可能想使用mv -i 来避免无意中覆盖任何文件。
    • @WilliamPursell 非常好。我应该记得的。谢谢你。答案更新为-i
    • 感谢您的回复。我关注除了 Mover {} 之外的所有内容。
    • @ChrisH Mover 分配给$0,文件名{} 分配给$1$0 什么都不做,除非 mv 命令生成错误,在这种情况下,shell 会报告错误,因为它在脚本 Mover 中。因此,为$0 选择一个描述性的名称只会使错误消息(如果有的话)更具可读性。您可以为此使用任何您想要的名称。不关心信息性错误消息的人通常只使用- 代替$0
    • 我是 bash 新手,但对它的力量感到惊讶。感谢您的帮助,尤其是深入的解释。
    猜你喜欢
    • 2018-04-14
    • 2021-07-18
    • 2012-02-11
    • 2016-05-29
    • 1970-01-01
    • 2018-07-17
    • 2021-06-07
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多