微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在所有图像上添加前缀递归

如何解决在所有图像上添加前缀递归

| 我有一个包含5000多个图像的文件夹,所有图像都带有JPG扩展名。 我想做的是递归地在所有图像上添加\“ thumb_ \”前缀。 我发现了一个类似的问题:重命名文件和目录(添加前缀),但是我只想将前缀添加到具有JPG扩展名的文件中。     

解决方法

可能的解决方案之一:
find . -name \'*.jpg\' -printf \"\'%p\' \'%h/thumb_%f\'\\n\" | xargs -n2  echo mv
Principe:找到所有需要的文件,并为标准
mv
命令准备参数。 笔记: ѭ1的参数由ѭ3包围,以允许在文件名中使用空格。 缺点是:与许多mp3文件一样,该文件名本身不包含“ 3”撇号的文件名将不起作用。如果您需要移动更多奇怪的文件名,请检查以下信息。 上面的命令用于空运行(仅显示带有args的mv命令)。为了进行实际工作,请删除the5并假装ѭ1。 重命名任何文件名。在外壳中,您需要一个定界符。问题是,文件名(存储在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的功能来整理文件名,并最终重命名文件。     ,当心文件名中带有空格的文件名(
for ... in ...
表达式会跳到那些空格),并注意a15ѭ的结果将始终以ѭ16start开头(因此请尝试使用诸如
thumb_./file.JPG
之类的名字,这不太正确)。 因此,这在任何情况下都不是一件容易的事。我发现可以正常工作的表达式(包括空格,子目录等)如下:
find . -iname \\*.JPG -exec bash -c \'mv \"$1\" \"`echo $1 | sed \\\"s/\\(.*\\)\\//\\1\\/thumb/\\\"`\"\' -- \'{}\' \\;
即使这样也可能与某些名称(带引号)相抵触...     ,您可以使用相同的答案,只需使用
*.jpg
,而不是just20ѭ。     ,
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$
    ,为此使用
rename
rename \'s/(\\w{1})\\.JPG$/thumb_$1\\.JPG/\' `find . -type f -name *.JPG`
    ,在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视图文件,以将它们全部移至admin部分。     ,仅适用于当前文件夹中的
jpg
个文件
for f in `ls *.jpg` ; do mv \"$f\" \"PRE_$f\" ; done
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。