使用find命令的-exec选项来重命名文件
使用find命令的-exec选项来重命名文件
我目前正在学习bash,并遇到了find
命令。我想使用它来查找并重命名所有的.py文件为.bak(例如,hello.py应该重命名为hello.bak)。\n我认为我应该能够写出这样的命令:\n
find -name "*.py" -exec mv {} NEW_NAME \;
\n其中NEW_NAME代表重命名后的{}。\n我尝试了各种复杂的方法,其中包括:\n
- \n
- 将{}赋值给一个变量:我无法进行变量赋值(例如
-exec a=1
返回一个错误)\n - 使用管道命令,但是尽管
echo $(echo ./hello.py | cut -d\'.\' -f2).bak
按预期返回/hello.bak
,但是用$(echo {} | cut -d\'.\' -f2).bak
替换NEW_NAME则不行。\n - 最后(感谢下面的链接:Changing arguments of {} find exec),我通过
find -name \"*.py\" -exec bash -c \'mv $0 ${0/.py/.bak}\' \"{}\" \\;
实现了我的目标。\n
\n
\n
\n
\n不过,我感觉还有更简单的方法来做到这一点,我可能忽视了一些明显的东西。\n编辑:我知道有其他批量重命名文件的方法,而不是使用find ... -exec ...
;我特别寻找使用此命令更好/更简单的方法(我希望有一些类似于Python的.replace()
字符串方法的Linux等效方法)。
这里提到的问题是如何使用find命令的-exec选项对文件进行重命名。文章中提到的解决方法是使用一个包含for循环的shell脚本来实现重命名操作。具体的命令如下:
find . -type f -name '*.py' -exec sh -c ' for src; do mv "$src" "${src%.*}.bak" done' sh {} +
文章还提到,虽然有一些第三方的rename命令可以实现相同的功能,但在POSIX中并没有完全标准的rename命令,而且不同的rename命令具有不同的功能和语法。
因此,解决这个问题的方法是使用find命令的-exec选项结合shell脚本来实现重命名操作。这种方法在UNIX中是常用的做法,虽然可能没有像Python的.replace()函数那样简洁,但是可以实现相同的功能。另外,也可以考虑使用第三方的rename命令来实现重命名操作,但需要注意不同命令的不同语法和功能。