回答:
「外部」が「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原因はfindASCII文字列として解釈し、それが(のようなマルチバイト文字を出力しますπ疑問符として)。これを修正するには、いくつかのプログラム(例:)にパイプするか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=CLC_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