如何清理文件扩展名?

如何清理文件扩展名?

我有一个包含 .MP3 文件的目录,我想将其扩展名更改为 .mp3。做到这一点最简单的方法是什么?我认为大致如下:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

……虽然我知道这不太正确。 :) 替换不正确,我不确定如何在in 中使用 amv和 ased命令。-execfind

我需要一个 bash 脚本吗?

答案1

这是在 Bash 中执行此操作的一种方法:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

我在这里使用的echo命令本身除了打印文件名对之外不执行任何操作。如果该列表代表您想要进行的更改,那么您可以更改echo为类似的内容mv -i --,然后将移动您的文件(并在覆盖之前提示您)。

简要说明:

遍历for与 . 匹配的每个文件*。然后,我们确定扩展名是否已经是小写,如果是,我们继续,如果不是,我们继续移动它(或回显它,视情况而定)。这使用了 Bash 的内置字符串操作,您可以在此处阅读:http://tldp.org/LDP/abs/html/string-manipulation.html

答案2

在 zsh 中:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

还要照顾.Mp3.mP3文件:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'

答案3

你可以使用改名命令(请注意有两个具有不同 API 的主要实现)。例如,要将文件扩展名的大小写从大写更改为小写,请尝试以下操作:

  • renamefrom util-linux(有时称为rename.ul),假设.JPG在文件名中只出现一次

    rename -- .JPG .jpg *.JPG
    
  • renamefrom perl(有时称为prename;已经发布了几个变体):

    rename 's/\.JPG$/.jpg/' ./*.JPG
    

这是一些伙计们教程关于他如何从凌乱的 bash 脚本转向这个简单的命令,以满足您的用例。

执行此操作的另一个奇特命令是pax。如果您的 shell 使用 ZSH,您也可以使用zmv.

答案4

你需要一个脚本,因为Linux下的“扩展名”实际上只是文件名字符串的一部分。您必须在脚本中进行一些字符串操作才能获取新名称。

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

如果文件名中有空格,双引号就很重要。我认为有些双引号有点不明显。

相关内容