我有一个包含超过5000张图片的文件夹,所有图片都带有JPG扩展名。
我想要做的是将“thumb_”前缀递归地添加到所有图像中。
我发现了一个类似的问题:Rename Files and Directories (Add Prefix)但我只想在带有JPG扩展名的文件中添加前缀。
答案 0 :(得分:5)
可能的解决方案之一:
find . -name '*.jpg' -printf "'%p' '%h/thumb_%f'\n" | xargs -n2 echo mv
Principe:找到所有需要的文件,并为标准mv
命令准备参数。
注意:
mv
的参数被'
包围,以允许文件名中的空格。'
撇号本身的文件名,就像许多mp3文件一样。如果你需要移动更奇怪的文件名,请检查以下。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