有没有办法重命名全部文件在目录中将其转换为小写|大写?
我正在寻找一行命令。
我喜欢 TotalCommander Alt + F7,现在我需要终端中的该功能。
答案1
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 扩展名的文件分配给变量。
更新按照命令添加-v
选项mv
安全数据表建议。
答案2
有一个更优雅和通用的实用程序叫做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"}' *
等等。
prename 的另一个好处是,在将文件重命名为现有文件名时,它可以保护您。
man prename
更多细节。
答案3
使用find
find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
为了find
- 当然,在
-name
放上你的图案之后。 -maxdepth 0
:仅限当前目录。
为了rename
-n, -nono
:无操作:打印要重命名的文件的名称,但不重命名。y/source/dest/
:将source中出现的模式空间中的字符音译为dest中对应的字符。
答案4
用于mmv
将匹配的字符串转换为大写:
$ mmv -r '*' '#u1'
引用模式很重要,否则它会扩展通配符。