递归添加文件扩展名到所有文件

问题描述:

我有几个目录和子目录包含文件没有文件扩展名。我想将.jpg添加到这些目录中包含的所有文件。我见过用于更改文件扩展名的bash脚本,但不是仅仅添加文件扩展名。它也需要递归,有人可以帮忙吗?递归添加文件扩展名到所有文件

替代命令(man find):

find . -type f -exec mv '{}' '{}'.jpg \; 

说明:这个递归找到的所有文件(-type f)从当前目录(.)开始,并应用移动命令(mv)到各他们。还请注意{}附近的引号,这样可以正确处理带空格的文件名(甚至是换行符......)。

这样,

for f in $(find . -type f); do mv $f ${f}.jpg; done 

我不希望你有空间分隔的文件名,
如果你这样做,该名称将需要处理一下。

如果你想从其他目录下执行命令,
可以更换find .find /target/directory。没有明确的循环

+1

这是缺少'do',如果文件名中有空格,最好引用文件名: for f in $(find。-type f);做mv“$ f”“$ {f} .jpg”;完成 – DrAl 2009-07-10 09:18:51

+0

,据推测我会从顶级目录内运行? – robjmills 2009-07-10 09:19:27

+0

@seengee:是的。请注意,该命令也会忽略`-type`中的短划线。 – Stephan202 2009-07-10 09:21:01

这将查找没有扩展名,并添加您的.jpg

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \; 

rename

不知道,它可以在不扩展重命名文件(我是在Windows 7现在)

这有点晚了,但我想我会补充说,一个更好的解决方案(尽管可能不太可读)比迄今为止的可能是:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/' 

使用find | xargs模式通常会导致更高效的执行,因为您不必为每个文件分叉一个新进程。

请注意,这需要Debian风格的发行版(aka prename)中找到的重命名版本,而不是传统的重命名。不过,这只是一个小小的perl脚本,因此在任何系统上使用上面的命令都会很容易。

重命名的所有文件在Windows基本没有扩展,你可以做ren * *.jpg 由于文件没有扩展名,只需要用*,或者如果你想改变PNG为JPG 使用ren *.png *.jpg