如何使用 -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 查找和重命名所有文件的主要内容,如果未能解决你的问题,请参考以下文章