
ファイル拡張子を大文字から小文字に置き換えるコマンドは何ですか?
例:
hello.JPG
hi.JPG
到着する:
hello.jpg
hi.jpg
答え1
扱っているファイル拡張子がわかっている場合は、ハードコードできます。
for f in *.JPG
do
mv "$f" "${f%.JPG}.jpg"
done
より一般的な場合:
for f in *
do
e="${f##*.}"
b="${f%.*}"
mv "$f" "${b}.${e,,}"
done
大変なことが終わるところbash変数の拡張到着する:
- 拡張子を保存します。 (ピリオドが見つかるまで、ファイル名の前にできるだけ多くを削除します。)
- ファイル名の残りの部分を保存します(少なくともファイル名の末尾のピリオドは削除してください)。
- ファイル名を新しいファイル名に変更し、プロセス
,,
で拡張子()を小文字に変更します。
答え2
まだリストされていない他の答えを追加するだけです。
for f in *.JPG; do mv "$f" "${f//JPG/jpg}"; done
答え3
rename ' -f and /[A-Z][^.]*$/ and s/\.[^.]+$/\L$&/' *
rename ' -f and s/\.[^.]*[A-Z][^.]*$/\L$&/' *
私たちは、その背後にはrename
コードがあるだけであるという事実に気づくべきですPerl
。次のように考えてみてください。ワイルドカードは*
aのこのコードに名前を提供し、各loop
名前に対して次のことを行います。
- 現在の名前(ループコンテナに保存されている)が通常のファイルであるかどうかをテストします
$_
(ファイルテスト演算子のファイル-f
名、ファイル名が省略されている場合はデフォルト$_
)。rename
するのを防ぎます。この可能性を!-f
-f
- ファイル名が大文字で始まらない場合は、名前を変更することは意味がありません。したがって、次の正規表現を使用してファイル名拡張子でこれを確認します。
/[A-Z][^.]*$/
これは、ファイル名の末尾に表示されていない連続した文字を調べて、ファイル名の拡張子部分に1つ以上の大文字が存在することを確認します。 。拡張を話せない状況が発生する可能性があります。これは、.
ファイル名でテキストを検索する次のステップで説明します。 - これで、現在のファイル名が一般的なファイルであり、少なくとも1つの大文字が存在するため、名前を変更できる候補であることがわかりました。正規表現は、
s/\.[^.]+$/\L$&/
ファイル名の末尾で左側を見て、リテラル[^.]+
テキストが表示されるまでドット以外のすべての文字をつかみ、現在のファイル名の完全な拡張子部分を分離します\.
。\L$&
一致するテキストのすべての大文字を小文字に変換します。 s///
1つのコマンド自体で拡張大文字の使用を確認するすべてのタスクを実行する2番目のバージョンを追加しました。- 特別な注意:通常、演算子を
m//
介してs///
追加された文字列に対して機能します=~
(例:)$var =~ m/[A-Z]+/
$filenm =~ s/ABC/DEF/
。ただし、問題の変数が=~の場合は$_
=~を省略し、単に作成すると、m/[A-Z]+/
s/ABC/DEF/
この正規表現が機能する変数がisであることを意味します$_
。また、区切り文字がスラッシュm
の場合は省略できます。m//
しかし、万が一の場合に備えて必ず必要ですm{}
m||
。これは非常に一般的なPerl
スタイルイディオムです。