为所有图像添加前缀(递归)

Mad*_*ord 4 linux bash command-line-interface

我有一个包含超过5000张图像的文件夹,全部都带有JPG扩展名.

我想要做的是递归地将"thumb_"前缀添加到所有图像.

我发现了一个类似的问题:重命名文件和目录(添加前缀) 但我只想将前缀添加到具有JPG扩展名的文件中.

jm6*_*666 5

可能的解决方案之一:

find . -name '*.jpg' -printf "'%p' '%h/thumb_%f'\n" | xargs -n2  echo mv
Run Code Online (Sandbox Code Playgroud)

Principe:找到所有需要的文件,并为标准mv命令准备参数.

笔记:

  • 由于允许文件名中的空格mv包围的参数'.
  • 缺点是:这不适用于包含'撇号本身的文件名,就像许多mp3文件一样.如果您需要移动更多奇怪的文件名,请检查以下内容.
  • 上面的命令用于干运行(仅显示带有args的mv命令).对于实际工作,删除echo假装mv.

任何文件名重命名.在shell中你需要一个分隔符.问题是,文件名(存储在shell变量中)通常可以包含分隔符本身,因此:

mv $file $newfile         #will fail, if the filename contains space, TAB or newline
mv "$file" "$newfile"     #will fail, if the any of the filenames contains "
Run Code Online (Sandbox Code Playgroud)

正确的解决方案是:

  • 准备一个适当的转义文件名
  • 使用脚本语言,可以轻松理解任何文件名

使用它的内部和格式化指令= 可以在bash中准备正确的转义.但这个解决方案漫长而无聊.printf%qprint quoted

恕我直言,最简单的方法是使用perl和零填充print0,就像下一个.

find . -name \*.jpg -print0 | perl -MFile::Basename -0nle 'rename $_, dirname($_)."/thumb_".basename($_)'
Run Code Online (Sandbox Code Playgroud)

以上使用perl的功能来修改文件名,最后重命名文件.


edu*_*ffy 2

您可以使用相同的答案,只需使用*.jpg, 而不仅仅是*