哪个命令将目录中文件名的大写字母更改为小写?谢谢
我有文件
F1
F2
FILE1
FILE2
我想重新命名它们:
f1
f2
file1
file2
答案1
对于当前目录中的所有(非隐藏)文件
在zsh
shell 中,您可以执行以下操作:
autoload zmv # best in ~/.zshrc
zmv '*' '${(L)f}'
(zmv
如果在进行任何重命名之前存在任何冲突(例如当前目录中的aFILE
和文件),则中止)。File
(更改*
为*(#q^/)
仅重命名非目录文件,或*(#q-^/)
在符号链接解析后重命名非目录文件)
和mmv
:
mmv '*' '#l1'
(除非传递该选项,mmv
否则不会重命名目录(甚至是目录的符号链接) )-r
使用 Perl 的rename
实用程序或其任何变体(有时称为prename
):
rename '$_ = lc $_' ./*
zmv
,mmv
并且(的某些变体)rename
可以-n
选择试运行和-v
冗长的显示正在执行的操作的选项。
的某些变体rename
仅翻译 ASCII 字母。其他一些,例如,mmv
无论区域设置如何,都会将输入视为 UTF-8。zmv
将根据区域设置正确翻译,就像下面的其他方法一样。
在bash
外壳中:
for f in *[[:upper:]]*; do
# [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
# [ -L "$f" ] && continue # uncomment to also skip symlinks even
# if they resolve to regular files
mv -i -- "$f" "${f,,}"
done
(-i
在覆盖文件之前询问,但在每次重命名时;某些mv
实现支持-v
冗长的显示正在执行的操作的选项。 GNU 实现有一个-T
选项,您也想在这里使用它以避免mv FOO foo
成为将 FOO 移至 foo 目录foo
如果当前目录中有目录)。
ksh
在,zsh
和外壳中bash
:
typeset -l f
for F in *[[:upper:]]*; do
# [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
# [ -L "$f" ] && continue # uncomment to also skip symlinks even
# if they resolve to regular files
f=$F
mv -i -- "$F" "$f"
done
(pdksh
尽管衍生品仅翻译 ASCII 字母)
POSIXly(假设文件名不以换行符结尾):
tolower() {
awk 'BEGIN{print tolower(ARGV[1])}' "$1"
}
for f in *[[:upper:]]*; do
# [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
# [ -L "$f" ] && continue # uncomment to also skip symlinks even
# if they resolve to regular files
mv -i -- "$f" "$(tolower "$f")"
done
有些awk
实现mawk
仅翻译 ASCII 字母。
递归(也重命名子目录中的文件)
(您可能仍然想阅读上一节有关注意事项和注意事项的内容,其中大部分也适用于此处)
zsh 的zmv
:
zmv '(**/)(*)' '$1${(L)2}'
如果有大量文件,您可以通过zmodload zsh/files
预先运行来加快速度,这将启用内置版本mv
(用于zmv
实际进行重命名)。
mmv
(仅重命名非目录):
mmv ';*' '#1#l2'
使用find
和perl
's rename
(也重命名隐藏文件和隐藏目录中的文件):
find . -depth -name '*[[:upper:]]*' -exec rename '
s:[^/]+\Z:\L$&:' {} +
POSIXly(也重命名隐藏文件和隐藏目录中的文件):
find . -depth -name '*[[:upper:]]*' -exec sh -c '
for f do
dir=${f%/*}
name=${f##*/}
newname=$(awk "BEGIN{print tolower(ARGV[1])}" "$name")
mv -i -- "$f" "$dir/$newname"
done' sh {} +
答案2
一种替代方法是使用rename - Perl extension for renaming multiple files
.
要将所有文件名转换为小写:rename 'y/A-Z/a-z/' *
如果您不想安装它,您可以:
for item in *; do
mv "$item" "${item,,}"
done