如何重命名使用find命令找到的文件

时间:2019-04-12 00:55:59

标签: bash find renaming

我有一系列音乐文件夹。有些文件名包含下划线,我想删除下划线。

使用

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

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

1 个答案:

答案 0 :(得分: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或其他任何东西)可能会有很大帮助。