web-dev-qa-db-ja.com

Windowsのファイル名にASCII以外の文字が含まれるファイルを検索XP

ファイル名に非ASCII(つまりUnicode)文字が含まれている特定のディレクトリ内のすべてのファイルを見つける簡単な方法はありますか?私はWindows XP x64 SP2、NTFSファイルシステムを実行しています。

9
EMP

Powershellを使用する方法は次のとおりです。

gci -recurse . | where {$_.Name -cmatch "[^\u0000-\u007F]"}
14

私はこのための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)
5
EMP

これがMicrosoftの文字クラスです。大文字と小文字を区別する一致でのみ機能します。大文字のPは「ない」を意味します。

gci -recurse . | where { $_.name -cmatch '\P{IsBasicLatin}' } # 0000 - 007F

または、スペースからチルダ、タブまで、印刷できません。

gci -recurse . | where { $_.name -cmatch '[^ -~\t]' }

あなたがそれをどのように行うかに応じて、非ASCII文字を検索することには落とし穴があります。小文字バージョンがasciiである2つの非ASCII文字、トルコ語İ(0x130)、およびケルビン記号(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 asciiとして一致(大文字と小文字を区別しない):

[char]0x0212a | select-string '[\u0000-\u007f]' 

K

大文字と小文字が区別されます。

[char]0x0212a | select-string '[\u0000-\u007f]' -CaseSensitive # no output
1
js2010

コマンドを開くプロンプトcmdコマンドを実行します:chcp 65001これにより、コードページがUTF-8に変更されます

次に、ファイルリストを作成します:dir c:\myfolder /b /s >c:\filelist.txt

これで、検索するすべてのファイル名を含む、utf-8でエンコードされたテキストファイルができました。これで、このファイルを Notepad ++ (フリーテキストエディタ)にロードして、[^\x{0000}-\x{007F}]のような正規表現で非ASCII文字を検索できます。

enter image description here

0
Max