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

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);完成 证明: 仅适用于当前文件夹

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

我想做的是,递归地向所有图像添加“thumb_”前缀


我发现了一个类似的问题:但我只想将前缀添加到具有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
任何文件名重命名。在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 "
正确的解决方案是:

  • 准备具有正确转义的文件名
  • 使用脚本语言轻松理解任何文件名
使用bash的内部
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