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.


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]"}

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)

J'ai testé ce script et il fonctionne exactement comme le script powershell ci-dessus. superuser.com/a/272063/117014
ray pixar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.