如何将文件名的大写字母更改为小写?

如何将文件名的大写字母更改为小写?

哪个命令将目录中文件名的大写字母更改为小写?谢谢

我有文件

F1
F2
FILE1
FILE2

我想重新命名它们:

f1
f2
file1
file2

答案1

对于当前目录中的所有(非隐藏)文件

zshshell 中,您可以执行以下操作:

autoload zmv # best in ~/.zshrc
zmv '*' '${(L)f}'

zmv如果在进行任何重命名之前存在任何冲突(例如当前目录中的aFILE和文件),则中止)。File

(更改**(#q^/)仅重命名非目录文件,或*(#q-^/)在符号链接解析后重命名非目录文件)

mmv

mmv '*' '#l1'

(除非传递该选项,mmv否则不会重命名目录(甚至是目录的符号链接) )-r

使用 Perl 的rename实用程序或其任何变体(有时称为prename):

rename '$_ = lc $_' ./*

zmvmmv并且(的某些变体)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'

使用findperl'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

相关内容