如何重命名使用 find 命令找到的文件
How do I rename files found with the find command
我有一系列的音乐文件夹。一些文件名包含我想去掉的下划线。
与
find /Users/Chris/CDs -type f -name "*_*"
我发现所有带下划线的文件。
看来我可以将 -execdir mv {}
添加到命令中,但不知道从那里添加什么。
我认为 {}
提供完整路径和文件名作为带下划线的文件字符串,但我不知道如何使用 sed 's/_//g'
之类的东西来删除新文件名上的 _。
任何帮助将不胜感激。
尝试:
find /Users/Chris/CDs -type f -name "*_*" -execdir bash -c 'mv -i -- "" "${1//_/}"' Mover {} \;
工作原理:
-execdir bash -c '...' Mover {} \;
这将启动 bash 并告诉它 运行 单引号中的命令,Mover
分配给 [=18=]
,文件名分配给 </code>.</p></li>
<li><p><code>mv -i -- "" "${1//_/}"
这将重命名文件 </code>。这使用 bash 的参数扩展功能 <code>${1//_/}
,通过删除所有下划线从 </code> 创建目标名称。</p>
<p>选项 <code>-i
告诉 mv
在覆盖文件之前交互询问。
选项--
告诉mv
没有更多选项。这是必需的,以便正确处理名称以 -
开头的文件。
例子
让我们从包含这些文件的目录开始:
$ ls
1_2_3_4 a_b c_d
接下来我们运行我们的命令:
$ find . -type f -name "*_*" -execdir bash -c 'mv -i -- "" "${1//_}"' Mover {} \;
命令完成后,文件为:
$ ls
1234 ab cd
目的[=18=]
在我们添加错误的地方观察这个命令:
$ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "" "${1//_}"' Mover {} \;
Mover: foobar: command not found
请注意,Mover
出现在错误消息的开头。这表示错误来自 bash -c
命令。
如果我们用 -
替换 Mover
,我们会看到:
$ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "" "${1//_}"' - {} \;
-: foobar: command not found
当 运行在终端中执行单个命令时,错误的来源可能仍然很明显。但是,如果这个 find
命令被埋在一个长脚本中,那么使用更具描述性的 [=18=]
,如 Mover
或其他,可能会有很大的帮助。
我有一系列的音乐文件夹。一些文件名包含我想去掉的下划线。
与
find /Users/Chris/CDs -type f -name "*_*"
我发现所有带下划线的文件。
看来我可以将 -execdir mv {}
添加到命令中,但不知道从那里添加什么。
我认为 {}
提供完整路径和文件名作为带下划线的文件字符串,但我不知道如何使用 sed 's/_//g'
之类的东西来删除新文件名上的 _。
任何帮助将不胜感激。
尝试:
find /Users/Chris/CDs -type f -name "*_*" -execdir bash -c 'mv -i -- "" "${1//_/}"' Mover {} \;
工作原理:
-execdir bash -c '...' Mover {} \;
这将启动 bash 并告诉它 运行 单引号中的命令,
Mover
分配给[=18=]
,文件名分配给</code>.</p></li> <li><p><code>mv -i -- "" "${1//_/}"
这将重命名文件
</code>。这使用 bash 的参数扩展功能 <code>${1//_/}
,通过删除所有下划线从</code> 创建目标名称。</p> <p>选项 <code>-i
告诉mv
在覆盖文件之前交互询问。选项
--
告诉mv
没有更多选项。这是必需的,以便正确处理名称以-
开头的文件。
例子
让我们从包含这些文件的目录开始:
$ ls
1_2_3_4 a_b c_d
接下来我们运行我们的命令:
$ find . -type f -name "*_*" -execdir bash -c 'mv -i -- "" "${1//_}"' Mover {} \;
命令完成后,文件为:
$ ls
1234 ab cd
目的[=18=]
在我们添加错误的地方观察这个命令:
$ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "" "${1//_}"' Mover {} \;
Mover: foobar: command not found
请注意,Mover
出现在错误消息的开头。这表示错误来自 bash -c
命令。
如果我们用 -
替换 Mover
,我们会看到:
$ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "" "${1//_}"' - {} \;
-: foobar: command not found
当 运行在终端中执行单个命令时,错误的来源可能仍然很明显。但是,如果这个 find
命令被埋在一个长脚本中,那么使用更具描述性的 [=18=]
,如 Mover
或其他,可能会有很大的帮助。