Filenames

如何將我的文件名的大寫字母更改為小寫?

  • August 8, 2019

哪個命令將目錄中文件名的大寫字母更改為小寫?謝謝

我有文件

F1
F2
FILE1
FILE2

我想重命名它們:

f1
f2
file1
file2

對於目前目錄中的所有(非隱藏)文件

zsh外殼中,您可以執行以下操作:

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成為move FOO如果目前目錄中有目錄,則進入 foofoo目錄)。

ksh,zshbashshell 中:

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'

使用findand (也重命名隱藏文件和隱藏目錄中的文件)perlrename

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 {} +

引用自:https://unix.stackexchange.com/questions/534480