回答:
「外部」が「ASCII文字ではない」ことを意味すると仮定するfind
と、パターンで使用して、名前に印刷可能なASCII文字を持たないすべてのファイルを見つけることができます。
LC_ALL=C find . -name '*[! -~]*'
(スペースはhttp://www.asciitable.com/にリストされている最初の印刷可能文字で~
あり、最後の文字です。)
のヒントLC_ALL=C
が必要です(実際、LC_CTYPE=C
およびLC_COLLATE=C
)、そうでない場合、文字範囲は誤って解釈されます。マニュアルページも参照してくださいglob(7)
。以来LC_ALL=C
原因はfind
ASCII文字列として解釈し、それが(のようなマルチバイト文字を出力しますπ
疑問符として)。これを修正するには、いくつかのプログラム(例:)にパイプするかcat
、ファイルにリダイレクトします。
文字範囲を指定する代わりに、[:print:]
「印刷可能な文字」を選択するためにも使用できます。必ずCロケールを設定してください。そうしないと、かなり(一見)任意の動作が得られます。
例:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π
LC_ALL=C
代わりに使用します。LC_COLLATE=C
LC_CTYPE
SPC
で印刷可能な、そして何についてTAB
とをLF
、典型的には、テキストファイルで発見されましたか?
LC_COLLATE
とLC_CTYPE
、また参照のfind(1)
manページを。
を使用して各ファイル名を翻訳tr -d '[\200-\377]'
し、元の名前と比較する場合、特殊文字を含むファイル名は同じではありません。
(上記は、外国語で非ASCIIを意味すると仮定しています)
[
や]
ほとんどでtr
実装。
[
し、]
私のシステムで。
[
および]
s に加えて)非ASCIIシンボルを持つすべての(6つの)ファイル名を見つけました。ありがとう。
を使用tr
して、ファイル名から任意の外部文字を削除し、結果を元のファイル名と比較して、外部文字が含まれているかどうかを確認できます。
find . -type f > filenames
while read filename; do
stripped="$(printf '%s\n' "$filename" | tr -d -C '[[:alnum:]][[:space:]][[:punct:]]')"
test "$filename" = "$stripped" || printf '%s\n' "$filename";
done < filenames