
拡張ASCII文字(0x80-0xFF)を含むディレクトリツリーですべてのファイル名を見つけたいです。私はこれを行うことができると思います:
find . -regex '.*[\x80-\xFF]+.*'
しかし、それはすべてと一致します。また、標準のaz、AZ、0-9、ハイフン、またはピリオドセットにない文字を含むファイルを見つけようとしました。
find . -regex '.*[^- a-zA-Z0-9]+.*'
明らかに私はここで根本的な側面を誤解しています。
私のツリーのファイルの例:
./file 1/file - 1 - A2.mkv
./file 1/file - 1 - A2.nfo
./tést/tést - 2 - 2.mkv
./français/français - 2 -3.mkv
Ubuntu 20.04ではfind(GNU findutils)4.7.0を使用しています。
答え1
$ tree
.
|-- file 1
| |-- file - 1 - A2.mkv
| `-- file - 1 - A2.nfo
|-- français
| `-- français - 2 -3.mkv
`-- tést
`-- tést - 2 - 2.mkv
3 directories, 4 files
$ LC_ALL=C find . -name '*[![:print:]]*'
./tést
./tést/tést - 2 - 2.mkv
./français
./français/français - 2 -3.mkv
これは、コマンドのロケールをfind
標準のPOSIXロケールに設定します。文字print
クラスには、文字クラスalpha
、に属するdigit
文字が含まれ、punct
空白文字も含まれます。これは、テストが-name '*[![:print:]]*'
次のように進行することを意味します。本物次の文字を含むファイル名の場合いいえprint
教室で。
さまざまな空白文字(タブなど)を含む名前を探したくない場合は、テストとして使用してください[![:graph:][:space:]]
(print
および間の唯一の違いはスペース文字を含まないことgraph
です)。graph
答え2
Kusalanandaの回答には、ASCII制御文字を含むファイル名も含まれています。これは望ましいかもしれませんが、そうでない場合、質問にもっと正確に答えるKusalalanandaベースのソリューションは次のとおりです。
LC_ALL=C find . -name $'*[\x80-\xff]*'
使用例:
$ touch foo bár $'baz\x01'
$ ls
bár 'baz'$'\001' foo
$ LC_ALL=C find . -name $'*[\x80-\xff]*'
./b??r
$ LC_ALL=C find . -name $'*[\x80-\xff]*' | od -tx1z
0000000 2e 2f 62 c3 a1 72 0a >./b..r.<
0000007
あなたがしたいものとの違いは、シェルが16進エスケープシーケンスをそのままにする代わりに解釈することですfind
。また、そうでない場合は、この単語が正規表現またはグローバル変数セクションにあるLC_ALL=C
ため、これが必要になることがあります。他のキャラクターの。.
*