我有一个包含 .MP3 文件的目录,我想将其扩展名更改为 .mp3。做到这一点最简单的方法是什么?我认为大致如下:
find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \;
……虽然我知道这不太正确。 :) 替换不正确,我不确定如何在in 中使用 amv
和 ased
命令。-exec
find
我需要一个 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 的主要实现)。例如,要将文件扩展名的大小写从大写更改为小写,请尝试以下操作:
与
rename
fromutil-linux
(有时称为rename.ul
),假设.JPG
在文件名中只出现一次rename -- .JPG .jpg *.JPG
与
rename
fromperl
(有时称为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
如果文件名中有空格,双引号就很重要。我认为有些双引号有点不明显。