如何清理文件扩展名?


9

我有一个包含.MP3文件的目录,我想将扩展名更改为.mp3。最简单的方法是什么?我认为有些类似的事情:

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

...虽然我知道那是不对的。:)替换不正确,我不确定如何在in中同时使用a mvsed命令。-execfind

我需要一个bash脚本吗?

Answers:


12

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

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

我在echo这里使用过,因此命令本身除了打印文件名对外,什么也不做。如果该列表表示您要进行的更改,则可以更改echomv -i --,然后将移动文件(并在覆盖之前提示您)。

简要说明:

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


感谢您的回答,并向我指出了有关bash字符串操作的链接!

7

在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'

6

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

  • with renamefrom util-linux(有时称为rename.ul),假设.JPG在文件名中仅发生一次

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

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

这是一些有关他如何从一个混乱的bash脚本转移到这个简单命令的教程,完全适合您的用例。

另一个执行此操作的命令是pax。如果您在外壳上使用ZSH,也可以使用zmv


超!正是我所需要的
JoshP

syntax error at (user-supplied code), near "."运行此命令时出现错误。
瑞安·盖茨

3

使用perl-rename,瑞士军刀对文件进行正则表达式重命名(在ubuntu上,这与perl软件包捆绑在一起作为别名):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

如果您选择的很仔细,请使用-n和-v选项对perl重命名以查看其实际作用。


感谢您的回答。服务器上没有perlrename,但今天晚些时候我将使用它进行处理!

0

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

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

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


1
您的脚本说不出任何错误,但是您绝对不需要脚本。在大多数shell中,可能有十几种方法可以在一行上完成此操作,并且有许多实用程序也可以使它变得容易。
Caleb

0

在bash中:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done

0

首先备份您的文件!您可以使用python一线式:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

编辑:

这是单线纸实际工作方式的详细说明。使用python -c我们将命令传递给python解释器。在osrename函数和glob文件列表导入库之后,我们需要遍历给定目录中的文件列表,我称之为PATH_TO_YOUR_DIRECTORY,例如./*对于当前目录中的所有内容。

不幸的是,在单线语法中,for循环在import表示法之后不起作用,因此我们需要使用方括号表示法。即,对于glob从给定路径以字符串形式给我们的每个文件或目录名称,我们将* .MP3替换为* .mp3。

由于OP没有提及递归搜索,因此我没有首先将其包括在内。

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.