我想将所有文件和文件夹(子文件夹)递归重命名为大写。
我发现一些脚本可以将其转换为小写字母,但我不知道如何更改它们,因此它将以相反的方式(从低到高)进行转换。
我找到并使用小写字母的脚本,但我不知道如何修改:
rename 'y/A-Z/a-z/' *
是来自man rename
。
我想将所有文件和文件夹(子文件夹)递归重命名为大写。
我发现一些脚本可以将其转换为小写字母,但我不知道如何更改它们,因此它将以相反的方式(从低到高)进行转换。
我找到并使用小写字母的脚本,但我不知道如何修改:
rename 'y/A-Z/a-z/' *
是来自man rename
。
Answers:
请注意,您使用的是由Debian及其衍生产品(Ubuntu,Mint等)分发的Perl脚本rename
。其他Linux发行版附带了一个完全不同且用途不多的命令rename
。
y/A-Z/a-z/
转换范围内的每个字符A
通过Z
进入该范围中的对应的字符a
通过z
,即ASCII大写字母到相应的小写字母。要执行相反的翻译,请使用y/a-z/A-Z/
。写同样的命令是另一种方式rename '$_ = uc($_)' *
- uc
是ü PPER Ç酶功能,并且rename
命令基于对所做的改造重命名文件$_
变量。
rename '…' *
仅重命名当前目录中的文件,因为这是*
匹配的。点文件(名称以开头的文件.
)也将被跳过。
如果要递归重命名当前目录和子目录中的文件,则可以使用find
命令递归遍历当前目录。这里有一个困难:如果您调用rename
,这将重命名目录和基本名称部分。如果您rename
在递归到目录之前调用目录(find -exec rename … {} \;
),find
则会感到困惑,因为它已找到目录,但是在尝试进入目录时该目录已不存在。你可以告诉解决这个find
行动前,遍历目录,但你最终会试图重命名foo/bar
到FOO/BAR
,但目录中FOO
不存在。
避免此困难的一种简单方法是使重命名命令仅对路径的基本名称部分起作用。正则表达式([^/]*\Z)
匹配不包含的路径的最后部分/
。
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
zsh外壳提供了更方便的重命名功能-比Perl更加隐秘,但更麻烦,而且通常更易于编写。
该函数zmv
根据模式重命名文件。运行autoload -U zmv
一次以将其激活(将此行放入中.zshrc
)。
在zmv
(要替换的模式)的第一个参数中,可以使用zsh强大的通配符模式。在zmv
(替换文本)的第二个参数中,可以使用其参数扩展功能,包括历史修饰符。
zmv -w '**/*' '$1$2:u'
说明:
-w
—自动为每个通配符模式分配数字变量**/*
—子目录中的所有文件,以递归方式(**/
匹配0、1或更多级子目录)$1
—第一个数字变量,此处与每个路径的目录部分匹配$2:u
—第二个数字变量,此处匹配每个路径的基本名称部分,并带有:u
用于将值转换为大写的修饰符作为一项额外的奖励,它尊重周围的语言环境设置。
如果不确定zmv
所编写的命令,则可以传递-n
选项以打印该命令将执行的操作,而不更改任何内容。检查输出,如果它做了您想要的操作,请重新运行该命令,而无需-n
实际执行操作。
从Gilles偷走(有少量修改)在这里
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
。
find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
应处理重命名目录的问题。正确?
rename
更改不存在。foo/bar
FOO/BAR
FOO
find -execdir
| 改名
如果不是因为相对路径疯狂,这将是最好的方法,因为它避免了Perl regex fu仅对基名称起作用:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\U$1/' '{}' \;
-execdir
首先cd
进入目录,然后仅对基本名称执行。
不幸的是,如果您在...中有相对路径,我将无法摆脱这一PATH
黑客问题,并且find -execdir
拒绝执行任何操作PATH
:https : //askubuntu.com/questions/621132/why-using-the-execdir-action-目录路径不安全/ 1109378#1109378
移至要重命名文件的目录后,请尝试以下操作:
for word in `ls -ltr |tail -n +2 |awk '{print $9}'`
do
a=$(echo $word | tr '[a-z]' '[A-Z]')
mv $word $a
echo "Done Successfully"
done
ls -l
只切除名字以外的列?),并在变量替换处使用双引号。您的代码过于复杂,并且破坏了包含空格和其他特殊字符的文件名。使用find
或**/
递归到子目录中,的输出ls
仅用于人类消费。
rename 'y/a-z/A-Z/' *
,将会得到想要的东西。仔细在哪里进行测试。