Rechercher des fichiers avec des caractères non-ASCII dans les noms de fichiers dans Windows XP

7

Existe-t-il un moyen simple de rechercher tous les fichiers d’un répertoire particulier contenant des caractères non-ASCII (c.-à-d. Unicode) dans le nom du fichier? J'utilise Windows XP x64 SP2, système de fichiers NTFS.

EMP
la source
Si le nom de fichier ne contient aucun octet supérieur à 0x7F, il s'agit de l'ASCII. Cela ne veut pas dire que c'est Unicode, cependant. Vous devriez pouvoir le faire en Python ainsi que dans de nombreux autres langages de programmation.
martineau

Réponses:

10

Voici une méthode utilisant Powershell:

gci -recurse . | where {$_.Name -match "[^\u0000-\u007F]"}
Cheran Shunmugavel
la source
vous pouvez l'utiliser comme un lot fichier: powershell -Command "gci -recurse . | where {$_.Name -match '[^\u0000-\u007F]'}"
ray pixar
Cette réponse est excellente et toujours pertinente. Ce qui le rendrait encore meilleur (bien que le demandeur ne l’ait pas demandé) est une option pour remplacer ou retirer ces personnages illégaux.
Thomas
1
Deviner gci -recurse -force | where {$_.Name -match "[^\u0000-\u007F]"} | rename-item -newname { $_.name -replace "[^\u0000-\u007F]",''}
Thomas
5

J'ai fini par écrire un script Python pour cela. L'afficher au cas où cela pourrait aider quelqu'un. N'hésitez pas à passer à 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)
EMP
la source
J'ai testé ce script et il fonctionne exactement comme le script powershell ci-dessus. superuser.com/a/272063/117014
ray pixar