如何使用 -exec 查找和重命名所有文件

Posted

技术标签:

【中文标题】如何使用 -exec 查找和重命名所有文件【英文标题】:How to find and rename all files using -exec 【发布时间】:2018-01-21 16:17:41 【问题描述】:

我想重命名所有以“.mp4”结尾的文件,而不是空格来包含下划线。 示例:

Original file -> test 1.mp4
Renamed file -> test_1.mp4

我正在尝试:

find . -iname "*.mp4"  -exec mv  $(echo '' | tr " " "_") \;

但我只有:

mv: ‘./test 1.mp4’ and ‘./test 1.mp4’ are the same file

我的管道似乎无法正常工作。我将不胜感激。

【问题讨论】:

试试find . -iname "*.mp4" -exec mv "" $(echo '' | tr " " "_") \; 祝你好运。 Recursively rename files using find and sed的可能重复 【参考方案1】:

到目前为止,似乎唯一的方法是通过“重命名”命令。

这是有效的命令:

find /tmp/test/ -iname "*.mp4" -exec rename " " "_" "" \;

【讨论】:

这只会替换第一个空格字符,必须多次重新运行才能替换所有。【参考方案2】:

我会考虑使用 rename 命令,假设您的发行版提供它。在 Debian 中:https://packages.debian.org/rename

如果您不需要在子目录中搜索:

rename 's/\ /_/' *.mp4

如果你这样做:

find . -iname "*.mp4" -execdir rename 's/\ /_/' \;

如果必须替换多个空格,则搜索/替换表达式变为's/\ /_/g'

如果您真的想保留您的语法/方法,请参阅这个非常相似的问题:find -exec with multiple commands

【讨论】:

由于搜索将是递归的,因此“查找”方式应该更合适,但它会给出错误: [code]$ find 。 -iname "*.mp4" -exec 重命名 's/\ /_/' \;重命名:没有足够的参数[/code] 我无法重现您的错误。我假设您的发行版(它是哪一个?)有一个不同的命令来回答“重命名”。但是在我的测试中,我发现当遇到名称包含空格的目录时,我的递归答案将失败(出现不同的错误)。因此,我删除了这部分答案。 发行版是 CentOS 7。确实存在“重命名”,但我从未设法使其工作。 我看到了您的回答,很高兴您找到了适合您的解决方案。我已经修复并重新添加了我的递归解决方案 - 如果您的目录名称也包含空格,您可能也想查看 -execdir 而不是 -exec 。记住,男人是你的朋友 :-) 如你所见,CentOS 的重命名确实不一样:unix.com/man-page/centos/1/rename

以上是关于如何使用 -exec 查找和重命名所有文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CopyWebpackPlugin 复制和重命名文件

如何使用 php 上传、归档和重命名文件?

在工作区中查找和重命名变量(如果存在任何名称)

如何在 Linux 中批量移动复制追加和重命名文件

如何使用shell复制和重命名多个文件

如何在 Android 中删除和重命名文件?