是否可以将目录中的所有文件重命名为小写|大写?
我正在寻找一个oneliner命令。
我喜欢TotalCommander alt+f7,现在我需要在终端中使用该功能
是否可以将目录中的所有文件重命名为小写|大写?
我正在寻找一个oneliner命令。
我喜欢TotalCommander alt+f7,现在我需要在终端中使用该功能
Answers:
对于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
有一个更优雅,更通用的实用程序,称为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 更多细节。
findfind . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find-name放好图案之后。-maxdepth 0:仅当前目录。rename-n, -nono:无操作:打印要重命名的文件名,但不重命名。y/source/dest/:将模式空间中出现在源中的字符音译为dest中相应的字符。
mv以便您看到正在执行的操作;您可能不希望传递“ -f”,因为这可能破坏现有文件