Linux 向所有图像添加前缀(递归)
我有一个包含5000多张图片的文件夹,所有图片都带有JPG扩展名 我想做的是,递归地向所有图像添加“thumb_”前缀Linux 向所有图像添加前缀(递归),linux,bash,command-line-interface,Linux,Bash,Command Line Interface,我有一个包含5000多张图片的文件夹,所有图片都带有JPG扩展名 我想做的是,递归地向所有图像添加“thumb_”前缀 我发现了一个类似的问题:但我只想将前缀添加到具有JPG扩展名的文件中。您可以使用相同的答案,只需使用*.JPG,而不仅仅是*;执行mv$文件和U$文件;完成 如果当前目录下有多个目录级别: 用于文件,单位为$(find.-name'*.JPG');do mv$file$(dirname$file)/thumb_$(basename$file);完成 证明: 仅适用于当前文件夹
我发现了一个类似的问题:但我只想将前缀添加到具有JPG扩展名的文件中。您可以使用相同的答案,只需使用
*.JPG
,而不仅仅是*
;执行mv$文件和U$文件;完成
如果当前目录下有多个目录级别:
用于文件,单位为$(find.-name'*.JPG');do mv$file$(dirname$file)/thumb_$(basename$file);完成
证明:
仅适用于当前文件夹中的
jpg
文件
for f in `ls *.jpg` ; do mv "$f" "PRE_$f" ; done
当心带有空格的文件名(
for…in…
expression会跳过这些空格),并注意find…(查找)的结果
总是以/
开头(因此尝试给你起thumb./file.JPG
这样的名字,这不太正确)
因此,在任何情况下,这都不是一件小事。我发现正确使用的表达式(使用空格、子曲面等)是:
即使这样,也可能与某些名称相冲突(在中加引号).可能的解决方案之一:
find . -name '*.jpg' -printf "'%p' '%h/thumb_%f'\n" | xargs -n2 echo mv
普林西比:找到所有需要的文件,并为标准的mv
命令准备参数
注:
的参数被mv
包围,用于在文件名中允许空格“
- 缺点是:这不适用于包含撇号本身的文件名,就像许多mp3文件一样。如果您需要移动更多奇怪的文件名,请检查下面的命令
- 上述命令用于干运行(仅显示带有args的mv命令)。要进行实际工作,请删除回声假装mv
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
,就像next一样
find . -name \*.jpg -print0 | perl -MFile::Basename -0nle 'rename $_, dirname($_)."/thumb_".basename($_)'
上面介绍了如何使用perl的强大功能来咀嚼文件名并最终重命名文件。为此使用
rename
:
rename 's/(\w{1})\.JPG$/thumb_$1\.JPG/' `find . -type f -name *.JPG`
在OS X 10.8.5中,“查找”没有-printf选项。包含rename的端口似乎依赖于需要数小时才能安装的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视图文件,把它们全部移到一个管理部门。正如参考问题的答案所说的,你需要考虑有空格的文件名。@ MadisonFord,如果你的文件有一个扩展名为JPG而不是.jpg,这在正常的Linux环境中是不起作用的。Bash通常区分大小写
shopt-s nocaseglob
将关闭区分大小写功能。@MadisonFord,文件名中的空格在您的案例中是否有问题?你粘贴了哪个命令?我需要在所有文件夹(递归)中粘贴。我有300多个文件夹和5000多个图像。这是错误的。几乎从不解析ls
的输出。尝试一个文件触摸“a b c.jpg”
,相反,*.jpg中的f的要好得多。使用@jcomeau_ictx的答案,只需在移动文件时放入”
。可能的副本,只需将“*”
替换为“*.jpg”
。您始终可以安装findutils
macport-包含gnu查找的内容(命令:gfind
)和-printf
。只需注意,我得到了一个文件notfound错误的每一行,但它工作的承诺
rename 's/(\w{1})\.JPG$/thumb_$1\.JPG/' `find . -type f -name *.JPG`
find . -iname "*.jpg" -print | while read name; do cur_dir=$(dirname "$name"); cur_file=$(basename "$name"); mv "$name" "$cur_dir/thumb_$cur_file"; done