批量重命名文件为小写

Una*_*rai 19 command-line rename batch-rename

有没有办法将目录中的所有文件重命名为小写|大写?

我正在寻找oneliner命令。

我喜欢 TotalCommander 的Alt + F7,现在我需要在终端中使用该功能。

Ste*_*f K 20

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

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;
Run Code Online (Sandbox Code Playgroud)

对于大写,将参数反转为 [: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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您可能希望将“-v”传递给`mv`,以便您查看正在执行的操作;您可能_不_想要传递“-f”,因为这可能会破坏现有文件 (4认同)
  • 抱歉,关于 ls *jpg 的部分是一个**坏**主意。http://mywiki.wooledge.org/ParsingLs 您可以使用 *jpg 获得与最初使用 * 相同的结果。 (3认同)

ari*_*ica 17

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

由拉里·沃尔 (Larry Wall) 撰写,随附,perl因此很可能已经在您的系统上可用/usr/bin/prename(如果您有设置替代品,也可以/usr/bin/rename通过 /etc/alternatives 以符号链接的形式提供prename

使用它,您可以通过提供任何 perl 表达式(包括但不限于替换s///或字符音译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"}'  *
Run Code Online (Sandbox Code Playgroud)

等等。

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

man prename 更多细节。