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

时间:2011-05-26 14:21:41

标签: linux bash command-line-interface

我有一个包含超过5000张图片的文件夹,所有图片都带有JPG扩展名。

我想要做的是将“thumb_”前缀递归地添加到所有图像中。

我发现了一个类似的问题:Rename Files and Directories (Add Prefix)但我只想在带有JPG扩展名的文件中添加前缀。

7 个答案:

答案 0 :(得分:5)

可能的解决方案之一:

find . -name '*.jpg' -printf "'%p' '%h/thumb_%f'\n" | xargs -n2  echo mv

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 "

正确的解决方案是:

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

使用内部printf%q格式设置指令= print quoted,可以在 bash 中准备正确的转义。但这个解决方案漫长而无聊。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

谨防带有空格的文件名(for ... in ...表达式超过这些文件名),并注意find . ...的结果始终以./开头(因此尝试给出你的名字如thumb_./file.JPG,这不太正确。)

因此,在任何情况下都要做到这一点并非易事。我发现正确工作的表达式(包含空格,子目标和所有这些)是:

find . -iname \*.JPG -exec bash -c 'mv "$1" "`echo $1 | sed \"s/\(.*\)\//\1\/thumb/\"`"' -- '{}' \;

即使这样也会违反某些名字(带引号)......

答案 3 :(得分:1)

for file in *.JPG; do mv $file thumb_$file; done

如果它是当前目录下的多个目录级别:

for file in $(find . -name '*.JPG'); do mv $file $(dirname $file)/thumb_$(basename $file); done

<小时/> 证明:

jcomeau@intrepid:/tmp$ mkdir test test/a test/a/b test/a/b/c
jcomeau@intrepid:/tmp$ touch test/a/A.JPG test/a/b/B.JPG test/a/b/c/C.JPG
jcomeau@intrepid:/tmp$ cd test
jcomeau@intrepid:/tmp/test$ for file in $(find . -name '*.JPG'); do mv $file $(dirname $file)/thumb_$(basename $file); done
jcomeau@intrepid:/tmp/test$ find .
.
./a
./a/b
./a/b/thumb_B.JPG
./a/b/c
./a/b/c/thumb_C.JPG
./a/thumb_A.JPG
jcomeau@intrepid:/tmp/test$

答案 4 :(得分:1)

使用rename

rename 's/(\w{1})\.JPG$/thumb_$1\.JPG/' `find . -type f -name *.JPG`

答案 5 :(得分:1)

在OS X 10.8.5中,find没有-printf选项。包含重命名的端口似乎依赖于需要数小时才能安装的WebkitGTK开发包。

这一行,递归文件重命名脚本对我有用:

find . -iname "*.jpg"  -print | while read name; do cur_dir=$(dirname "$name"); cur_file=$(basename "$name"); mv "$name" "$cur_dir/thumb_$cur_file"; done

我实际上是使用'admin_'前缀重命名CakePHP视图文件,将它们全部移动到管理部分。

答案 6 :(得分:-1)

仅适用于当前文件夹中的jpg个文件

for f in `ls *.jpg` ; do mv "$f" "PRE_$f" ; done