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