使用bash向文件添加文件扩展名


Answers:


116
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
第二个非常适合重命名无扩展名的文件!谢谢!
anon58192932 2014年

2
第二个添加了所有文件的扩展名,而不仅仅是无扩展名的文件
Jeff

5
就像"${f%.jpg}"bash shell字符串操作一样。`$ {string%substring}`从$ string的后面删除$ substring的最短匹配项。
Jichao

警告:如果您的文件夹带有混合扩展名,请注意以上内容.jpg甚至会添加到普通文件中。
sachinruk

61

您可以使用重命名:

rename 's/(.*)/$1.jpg/' *

3
您正在使用哪个版本的重命名?我的观点不同:rename from to file...
约翰逊·B·约翰逊

1
重命名包含在perl(版本5.10.1)中。
2011年

3
与Ubuntu中包含的重命名一起使用时效果很好(因此,我猜所有基于Debian的发行版)都比jm666的答案冗长得多。
Roger Heathcote 2012年

28

另一种方式-无循环

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

分解:

  • 查找所有不带扩展名的文件
  • 检查文件类型
  • 只过滤JPG文件
  • 删除文件类型信息
  • xargs为每个文件运行“ mv”

上面的命令是空运行,在它之后,您应该在mv之前删除“ echo”

编辑 有人建议在这里需要“将路径参数用引号引起来;避免参数在带有空格的路径上分开”

通常,此建议是正确的,在这种情况下不是。因为,这里的%是得到了替换通过壳膨胀,而是由xargs内部(直接地),所以%将即使在文件名空间中正确地被取代。

简单的演示:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...

您可以将其放入循环,而此xargs是多余的。在这种情况下,我更喜欢瑞安的答案。
Lucius

1
@Lucius-顺便说一句,这个问题想要“无扩展名”文件-因此Ryan应该只找到那些文件……
jm666

@ jm666嘿!如何修改代码段以将文件夹中的所有无扩展名文件重命名为其各自的扩展名。(我正在通过file -b $ filename命令检测到正确的扩展名。)
Soumyajit,2016年

24

很简单,用cd到文件所在的目录,然后:

for f in *;do mv $f $f.jpg;done

出于某种原因,这对我有用,但是塞思的引号解决方案不起作用。(OSX Mountain Lion bash)
delrocco

4
如果用于for f in *;do mv "$f" "$f".jpg;done支持文件名中的空格会更好。
Hritik

感谢您提供这种优雅而简单的解决方案-我已经多次找到了这个答案,但似乎无法记住它。#dejavu
蒂姆·安德森

15

空运行:

 rename -n s/$/.jpg/ *

实际重命名:

 rename s/$/.jpg/ *

6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

1

就我而言,我不知道文件类型,因此我在文件命令的帮助下使用了mv命令来检查并可能找到文件类型。该解决方案可能不适用于所有文件,因为file命令可能无法识别文件类型,但对我来说最有用。

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

awk的用途是剥离从命令文件返回的字符串的第二个单词,它实际上是扩展名。


自动处理jpg和png。使用它并可以工作-非常感谢!只有现在扩展才是CAPS。小问题虽然:)
krivar



-2

李瑞安

将文件扩展名添加到目录中多个没有文件扩展名的文件的正确语法是

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.