【问题标题】:Add file extension to files with bash使用 bash 为文件添加文件扩展名
【发布时间】:2011-09-01 02:57:08
【问题描述】:

使用 bash 将文件扩展名“.jpg”添加到无扩展名文件的好方法是什么?

【问题讨论】:

  • mv "${file}" "${file}.jpg" ?
  • 在您看来,什么是“无扩展名文件”?它是一个名称中没有点的文件吗?

标签: linux bash


【解决方案1】:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

【讨论】:

  • 第二个非常适合重命名无扩展名文件!谢谢!
  • 第二个在所有文件上添加扩展名,而不仅仅是无扩展名的文件
  • 就像注释 "${f%.jpg}" 是 bash shell 字符串操作。 ` ${string%substring}` 从 $string 后面删除 $substring 的最短匹配项。
  • 警告:如果您有一个混合扩展名的文件夹,请知道上面将.jpg添加到普通文件中。
  • 我们能否检查它是否已经以.jpg 结尾?防止在末尾添加额外的.jpg
【解决方案2】:

你可以使用重命名:

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

【讨论】:

  • 您使用的是哪个版本的重命名?我有不同的论点:rename from to file...
  • rename 包含在 perl 中,版本为 5.10.1。
  • 这适用于 Ubuntu 中包含的重命名(所以我猜是所有基于 Debian 的发行版),比 jm666 的答案详细得多。
  • 注意没有一个rename 工具:oylenshpeegul.typepad.com/blog/2011/12/…
【解决方案3】:

另一种方式 - 没有循环

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

细分:

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

上面的命令是为了dry run,在它之后你应该去掉mv之前的“echo”

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

通常,此建议是正确的,在这种情况下则不是。因为,这里% 被shell 扩展替换不是,而是被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 是多余的。在这种情况下,我更喜欢 Ryan 的回答。
  • @Lucius - 顺便说一句,问题想要“无扩展”文件 - 所以 Ryan 应该只找到那些......
  • @jm666 嘿!如何修改您的代码 sn-p 以将文件夹中的所有无扩展名文件重命名为各自的扩展名。 (我正在通过 file -b $filename 命令检测正确的扩展名。)
【解决方案4】:

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

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

【讨论】:

  • 出于某种原因,这对我有用,但赛斯的带引号的解决方案却不行。 (OSX 山狮庆典)
  • 如果使用for f in *;do mv "$f" "$f".jpg;done来支持文件名中的空格会更好。
  • 感谢这个优雅而简单的解决方案——我已经多次找到这个答案,但似乎无法记住它。 #dejavu
【解决方案5】:

试运行:

 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;

【讨论】:

    【解决方案7】:

    在我的情况下,我不知道文件类型,所以我在 filemv 命令/strong> 命令检查并可能找到文件类型。此解决方案可能并不适合所有文件,因为 file 命令可能无法识别文件类型,但它对我来说最有效。

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

    awk 的用途是去除命令 file 返回的字符串的第二个单词,实际上是扩展名。

    【讨论】:

    • 自动处​​理 jpg 和 png。使用它并且工作 - 非常感谢!只是现在扩展是大写字母。小问题虽然:)
    【解决方案8】:
    rename --dry-run * -a ".jpg" # test  
    * -a ".jpg" # rename
    

    【讨论】:

    • --dry-run 和 -a 在我的 rename 版本中不可用。如果这是特定于某些架构的,则应指定它。
    • 正如@FernandoCésar 所暗示的,没有一个rename 工具,因此不同系统中的语法可能会有所不同。请参阅oylenshpeegul.typepad.com/blog/2011/12/… 了解更多信息。
    【解决方案9】:

    您可以使用move multiple files。我是这个项目的维护者。语法很简单。

    mmf files*
    

    它将使用所有文件名打开您的 $EDITOR,或者默认情况下打开 vim,您可以简单地使用 Ctrl+v+G 在 vi​​m 中突出显示所有文件名的结尾,保存文件,退出它,您的所有文件改名了

    【讨论】:

      【解决方案10】:

      李安

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

      find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
      

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 2021-06-17
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多