ファイル名に非ASCII(つまりUnicode)文字が含まれている特定のディレクトリ内のすべてのファイルを見つける簡単な方法はありますか?私はWindows XP x64 SP2、NTFSファイルシステムを実行しています。
Powershellを使用する方法は次のとおりです。
gci -recurse . | where {$_.Name -cmatch "[^\u0000-\u007F]"}
私はこのためのPythonスクリプトを書くことになりました。誰かに役立つ場合に備えて投稿してください。StackOverflowに自由に移動してください。
import sys, os
def main(argv):
if len(argv) != 2:
raise Exception('Syntax: FindUnicodeFiles.py <directory>')
startdir = argv[1]
if not os.path.isdir(startdir):
raise Exception('"%s" is not a directory' % startdir)
for r in recurse_breadth_first(startdir, is_unicode_filename):
print(r)
def recurse_breadth_first(dirpath, test_func):
namesandpaths = [(f, os.path.join(dirpath, f)) for f in os.listdir(dirpath)]
for (name, path) in namesandpaths:
if test_func(name):
yield path
for (_, path) in namesandpaths:
if os.path.isdir(path):
for r in recurse_breadth_first(path, test_func):
yield r
def is_unicode_filename(filename):
return any(ord(c) >= 0x7F for c in filename)
if __name__ == '__main__':
main(sys.argv)
これがMicrosoftの文字クラスです。大文字と小文字を区別する一致でのみ機能します。大文字のPは「ない」を意味します。
gci -recurse . | where { $_.name -cmatch '\P{IsBasicLatin}' } # 0000 - 007F
または、スペースからチルダ、タブまで、印刷できません。
gci -recurse . | where { $_.name -cmatch '[^ -~\t]' }
あなたがそれをどのように行うかに応じて、非ASCII文字を検索することには落とし穴があります。小文字バージョンがasciiである2つの非ASCII文字、トルコ語İ
(0x130)、およびケルビン記号K
(0x212a)。この例では、小さいiと大文字のIの両方が非ASCIIとして一致します。
# powershell
echo i I | where { $_ -match '[\u0080-\uffff]' }
i
I
回避策は、大文字と小文字を区別する検索(ここではcmatch)を使用することです。
echo i I | where { $_ -cmatch '[\u0080-\uffff]' } # no output
Kelvin K
asciiとして一致(大文字と小文字を区別しない):
[char]0x0212a | select-string '[\u0000-\u007f]'
K
大文字と小文字が区別されます。
[char]0x0212a | select-string '[\u0000-\u007f]' -CaseSensitive # no output
コマンドを開くプロンプトcmd
コマンドを実行します:chcp 65001
これにより、コードページがUTF-8に変更されます
次に、ファイルリストを作成します:dir c:\myfolder /b /s >c:\filelist.txt
これで、検索するすべてのファイル名を含む、utf-8でエンコードされたテキストファイルができました。これで、このファイルを Notepad ++ (フリーテキストエディタ)にロードして、[^\x{0000}-\x{007F}]
のような正規表現で非ASCII文字を検索できます。