如何將我的文件名的大寫字母更改為小寫?
哪個命令將目錄中文件名的大寫字母更改為小寫?謝謝
我有文件
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
,zsh
和bash
shell 中: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
and (也重命名隱藏文件和隱藏目錄中的文件)perl
: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 {} +