一部のフォルダとサブフォルダには1,000,000個のファイルがあります。シェルコマンドを使用して、小文字から大文字に名前を変更したいと思います。拡張子を変更したくありません。ファイル名部分のみ。
私はこれを見つけました:
rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
しかし、再帰的ではなく、現在のフォルダ内のファイルでのみ機能します。
それからこれを試しました。
find . -depth -execdir rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/' {} \;
しかし、ファイルは変更されませんでした。
どのように再帰的に使用できますか?
答え1
Debianとその派生ディストリビューション(DebianやUbuntuなど)が提供するPerlの名前変更機能があるとします。問題は、-execdir
プレフィックス付きのファイル名を渡すことです./
。 (理由は、一部のコマンドが特定の文字で始まる引数を特別に処理するためです。これは、名前がファイルの場合はファイルに-foo
渡されるため、./-foo
オプションではなくファイルとして扱われます。)正規表現を使用すると、次のようになります。結果は$1
常に空であるため、新しい名前は以前の名前と同じです。
./
これを正規表現に適用します。
find . -depth -execdir rename 's/^(\.\/[^.]*)\.(.*)$/\U$1\E.$2/' {} \;
答え2
find . -type f -exec rename -v 's/(\w+).(\w+)$/\U$1\E.$2/' {} \;
答え3
この小さなbashスクリプトを使用できます。
#!/bin/bash
find . -type f -exec sh -c '
dn=`dirname "$1"`
bn=`basename "$1"`
fn=`echo "${bn%.*}"`
ext=`echo "${bn##*.}"`
FN=`echo "${fn^^}"`
newfn="${FN}"."${ext}"
#echo ${dn}/$newfn
if [ "${fn}" = "${FN}" ] ;then : ;else echo "${bn} renamed to ${newfn}";mv "$1" "${dn}/${newfn}";fi
' _ {} \;
答え4
ls -r | rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/'
これは大丈夫ですか?