递归地向所有文件添加文件扩展名

rob*_*lls 103 bash shell command-line file-extension file

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

Ste*_*202 218

没有显式循环的替代命令(man find):

find . -type f -exec mv '{}' '{}'.jpg \;
Run Code Online (Sandbox Code Playgroud)

说明:以递归方式查找-type f从当前目录()开始的所有文件().,并将move命令(mv)应用于每个文件.还要注意引号{},以便正确处理带空格(甚至是换行符......)的文件名.

  • 特别是,如果目录结构中存在大量文件(导致bash对要迭代的文件列表的长度感到不满),这个工作会更好. (7认同)
  • 此命令还将查找带有扩展名的文件。那是OP想要的吗? (2认同)
  • @ghostdog74:既然他接受了这个答案,上面的内容显然就成功了。否则,正如您下面提到的,添加 `-not -name "*.*"` 就可以了。 (2认同)

gho*_*g74 61

这将找到没有扩展名的文件并添加你的.jpg

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
Run Code Online (Sandbox Code Playgroud)

  • +1,因为这会跳过已有扩展名的文件. (8认同)

小智 9

这有点晚了,但我想我会补充一个比目前为止更好的解决方案(尽管可能性较差):

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

使用该find | xargs模式通常可以提高执行效率,因为您不必为每个文件分叉新进程.

请注意,这需要在Debian风格的发行版(也称为prename)中找到重命名版本,而不是传统的重命名.它只是一个很小的perl脚本,所以在任何系统上使用上面的命令都很容易.


nik*_*nik 7

像这样,

for f in $(find . -type f); do mv $f ${f}.jpg; done
Run Code Online (Sandbox Code Playgroud)

我不希望您有空格分隔的文件名,
如果您这样做,则需要对名称进行一些处理。

如果您想从其他目录执行命令,
可以find .find /target/directory.

  • 这缺少“do”,如果文件名中有空格,最好引用文件名: for f in $(find . -type f); 执行 mv "$f" "${f}.jpg"; 完毕 (2认同)