批量重命名文件为小写


17

是否可以将目录中的所有文件重命名为小写|大写?

我正在寻找一个oneliner命令。

我喜欢TotalCommander alt+f7,现在我需要在终端中使用该功能

Answers:


20

对于a_file当前目录中的每个文件,请重命名a_file为小写。

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

对于大写字母,请反转参数 [:lower:] [:upper:]

tr命令参考链接

更新资料

要获得更多控制权,*可以用代替ls

例如,在包含1.txt,2.txt,3.txt,1.jpg,2.jpg和3.jpg的目录中,为了仅过滤* .jpg文件,ls可以使用:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

上面的代码会将a_file所有扩展名为.jpg的文件分配给变量。

根据建议的sds 更新命令添加的-v选项。mv


4
您可能希望将“ -v”传递给,mv以便您看到正在执行的操作;您可能希望传递“ -f”,因为这可能破坏现有文件
sds

这对于名称中带有空格的文件不起作用。
天祥熊

您可以在文件名周围使用引号。
Stef K

2
抱歉,关于ls * jpg的部分是 主意。 mywiki.wooledge.org/ParsingLs 您可以首先使用* jpg来获得* jpg的相同结果。
天衣

16

有一个更优雅,更通用的实用程序,称为prename

它由Larry Wall撰写,perl因此它很可能已经在您的系统上可用,因为/usr/bin/prename(如果您有安装设置,也可以/usr/bin/rename通过/ etc / alternatives链接到prename)。

使用它,您可以通过提供任何perl表达式(包括但不限于替换s///或char音译tr///)在一个命令中重命名多个文件:

例子:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

等等。

关于重命名的另一个好处是,在将文件重命名为现有文件名的情况下,它可以保护您。

man prename 更多细节。


1

使用 find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

对于 find

  • 当然以后 -name放好图案之后。
  • -maxdepth 0:仅当前目录。

对于 rename

  • -n, -nono:无操作:打印要重命名的文件名,但不重命名。
  • y/source/dest/:将模式空间中出现在源中的字符音译为dest中相应的字符。
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.