ディレクトリ内のファイル名の大文字を小文字に変更するコマンドは何ですか?ありがとう
ファイルがあります
F1
F2
FILE1
FILE2
名前を変更したいです。
f1
f2
file1
file2
答え1
現在のディレクトリ内のすべての(隠されていない)ファイルについて
zsh
シェルでは、次のことができます。
autoload zmv # best in ~/.zshrc
zmv '*' '${(L)f}'
(zmv
名前を変更する前にクラッシュ(現在のディレクトリのファイルやファイルなど)がある場合は中断しますFILE
。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
inzsh
とシェル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
の使用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