Ubuntuでは、次のコマンドrename
(使用)を使用して、正規表現sudo apt-get rename
内の特定の文字を含むすべてのファイルの名前を変更しています。
find . -execdir rename 's/[^A-Za-z0-9_.@+,#!?:&%~\(\)\[\]\/ \-]/?/g' * {} \;
これはうまく動作し、他のすべての文字は?
。今、このようなフランス語の文字を含めたいと思いますàèìòù
。だからÀ-ÿ
正規表現に以下を追加しました。
find . -execdir rename 's/[^A-Za-zÀ-ÿ0-9_.@+,#!?:&%~\(\)\[\]\/ \-]/?/g' * {} \;
ただし、ファイル名が変更されずにÀ-ÿ
削除できなくなったため、このコマンドを実行した後にファイルが破損しているようです。
名前の変更正規表現にこれを含める正しい方法は何ですか?
答え1
これらのファイル名がUTF-8でエンコードされていると仮定した場合は、次のようにします。
find . -depth -execdir rename -n '
utf8::decode$_ or die "cannot decode $_\n";
s{[^\w.\@+,#!?:&%~()\[\]/ -]}{?}gs;
utf8::encode$_;
' {} +
(幸せになると削除されます-n
)。
一部のBSD実装ではファイルfind
名の前にプレフィックスを付けないため、ファイル名がで始まるとコマンドが失敗する可能性があります。バリアントを使用すると(他のすべてのPerlバリアントでは機能しません)に変更してこの問題を解決できます。./
-execdir
-
rename
rename -n
rename -n --
rename
最新バージョンperl
では\w
(言葉文字)は、英数字(ラテン語だけでなくすべてのアルファベットテキスト)またはアンダースコア文字やその他の文字です。コネクタ句読点文字Unicodeタグ(例:鋭いアクセントと組み合わせる次の文字はe
)の分解形式で表されますé
。
より制限的に使用するには、ラテン語のアルファベット(キリル文字、ギリシャ語の代わりに)、結合発音区別記号(通常はラテンアルファベットの発音区別記号で使用される文字に限定されません)、およびインドアラビア語の文字のみを\w
使用できます。あります。\p{latin}\p{mark}0-9_
10進数(他の種類の数字の除外)と下線(他の接続句読点を除く)
使用されていない場合、utf8::decode
文字perl
はiso8859-1シングルバイト文字セットでエンコードされていると見なされます(たとえば、0xc3 0xa9
UTF-8エンコーディングのあらかじめ組み立てられた形式é
はÃ
©
)。
または、以下を使用できますzsh
(ロケールエンコーディングに従って文字をデコードします(出力を参照locale charmap
))。
autoload zmv # best in ~/.zshrc
zmv -n '(**/)(*)(#qD)' '$1${2//[^][:alnum:]_.@+,#!?:&%~()[\/ -]/?}'
ロケールで有効な文字を形成しないバイトシーケンスの各バイトもaに変換されます?
(rename
上記はエラーで終了しますcannot decode
)。
これは[[:alnum:]]
あなたのロケールalnum
カテゴリを使用するので、他のUnicodeコネクタの句読点や表示文字を含めることはできません。
perl
Android zsh
(通常他のツールではない)では、同様の範囲は[a-zÀ-ÿ]
文字コードポイントに基づいています。たとえば、この範囲はそのコードポイントの範囲内の文字と一致します(アルファベット以外の文字を含み、ラテンアルファベットまたはフランス語で使用されるすべての文字は含まれませんazÀÿ
)。では、PerlコードでUTF-8エンコーディングを使用できるようにUTF-8エンコーディングも追加する必要があります。\u0061\u007A\u00C0\u00FF
abcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
œ
perl
use utf8
À
ÿ