使用find命令的-exec选项来重命名文件

10 浏览
0 Comments

使用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
  • \n

  • 使用管道命令,但是尽管echo $(echo ./hello.py | cut -d\'.\' -f2).bak按预期返回/hello.bak,但是用$(echo {} | cut -d\'.\' -f2).bak替换NEW_NAME则不行。\n
  • \n

  • 最后(感谢下面的链接:Changing arguments of {} find exec),我通过find -name \"*.py\" -exec bash -c \'mv $0 ${0/.py/.bak}\' \"{}\" \\;实现了我的目标。\n
  • \n

\n不过,我感觉还有更简单的方法来做到这一点,我可能忽视了一些明显的东西。\n编辑:我知道有其他批量重命名文件的方法,而不是使用find ... -exec ...;我特别寻找使用此命令更好/更简单的方法(我希望有一些类似于Python的.replace()字符串方法的Linux等效方法)。

0
0 Comments

这里提到的问题是如何使用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命令来实现重命名操作,但需要注意不同命令的不同语法和功能。

0