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



我有一个文件夹,里面有5000多个图像,所有图像都有JPG扩展。

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

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

可能的解决方案之一:

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

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

注:

  • CCD_ 2的自变量被CCD_
  • 缺点是:这将不适用于包含'撇号本身的文件名,就像许多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 "

正确的解决方案是:

  • 用正确的转义来准备文件名
  • 使用easuly理解的任何文件名的脚本语言

bash中准备正确的转义可以使用其内部printf%q格式化指令=print quoted。但这种解决方案漫长而乏味。

IMHO,最简单的方法是使用perl和零填充的print0,就像接下来一样。

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

上面使用perl的能力对文件名进行了编码,并最终重命名了文件。

小心带有空格的文件名(for ... in ...表达式会跳过这些文件名),并注意find . ...的结果总是以./开头(因此,请尝试为您提供thumb_./file.JPG之类的名称,这并不完全正确)。

因此,在任何情况下,这都不是一件小事。我发现正确的表达式(包括空格、子分区等等)是:

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

即使这样也可能与某些名称相冲突(加引号)。。。

在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视图文件,将它们全部移到一个管理部分。

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

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$

为此使用mv0:

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

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

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

最新更新