2 votes

Comment supprimer tous les fichiers d'une arborescence de répertoires dont le nom de fichier contient des caractères spéciaux tels que öäüß

Je rencontre un problème avec mon programme de sauvegarde, ce qui signifie que je dois supprimer tous les fichiers et dossiers dans une arborescence spécifique où le nom de fichier contient des caractères spéciaux, dans mon cas les caractères allemands tels que öäüß et leurs équivalents en majuscules.

Je serais très heureux de le faire en utilisant le terminal mais aucune des commandes que j'ai essayées n'a renvoyé de correspondance pour les fichiers. Quelqu'un peut-il me suggérer une commande que je pourrais utiliser pour trouver ces fichiers ?

Par exemple, j'ai essayé

find -name *ü*

mais aucun des fichiers n'est trouvé. Toute aide serait appréciée.

0 votes

Avez-vous essayé de mettre le paramètre entre guillemets: find -name '*ü*' -print ?

0 votes

Le finder et les dossiers intelligents devraient vous permettre de sélectionner tous les fichiers dans un sous-dossier ou un volume et de les mettre à la corbeille de manière graphique avec une grande facilité. Y a-t-il une raison pour laquelle vous devez utiliser le terminal pour effectuer cette opération? (je suppose que si la liste des caractères devient plus proche de 10 que de 4 - ce serait une raison valable maintenant que j'y pense)

1 votes

@patrix, oui j'ai essayé d'utiliser des guillemets - cela ne correspond pas non plus à aucun fichier ou dossier. Utiliser le Finder (@bmike) ne correspond pas non plus à aucun fichier ou dossier. Je pense que c'est dû au fait que je recherche des caractères spéciaux, car lorsque je recherche des caractères normaux, des fichiers/dossiers sont trouvés dans les deux cas.

1voto

Harald Hanche-Olsen Points 3981

Une solution quelque peu dangereuse est la suivante, à partir de la ligne de commande :

find . -type f ! -regex '.*/[ -.0-~]*' -exec rm {} +

Remplacez le seul . par le nom du répertoire racine si vous n'avez pas changé de répertoire pertinent au préalable. Pour plus de sécurité, essayez d'abord la commande plus courte suivante :

find . -type f ! -regex '.*/[ -.0-~]*'

et assurez-vous qu'elle n'identifie que les fichiers que vous souhaitez supprimer. L'expression régulière (regexp ou regex) ici correspondra à tout chemin d'accès se terminant par un slash suivi de toute combinaison de caractères ASCII imprimables, à l'exception du caractère /, les espaces étant les premiers et ~ les derniers, tandis que . et 0 entourent / dans la séquence ASCII.

Une mise en garde parmi tant d'autres : je ne sais pas si votre localisation actuelle pourrait modifier la séquence de collation des caractères et donc peut-être changer la signification de l'expression régulière. Je ne crois pas que cela soit le cas, mais si c'est le cas, l'exécution des commandes suivantes :

LC_COLLATE=C find …

devrait éliminer le danger.

Encore une autre mise en garde : assurez-vous d'avoir une sauvegarde avant d'essayer ceci. Je ne prendrai pas la responsabilité de toute perte de données si vous vous trompez. La ligne de commande est un excellent outil pour se tirer une balle dans le pied ! Parfois, un simple espace mal placé peut être une catastrophe. (Dans ce cas, par exemple, le fait de manquer l'espace unique après le crochet ouvrant est fatal.)

0 votes

Merci beaucoup @Harald, votre regex a parfaitement fonctionné. À la fin, j'ai utilisé la commande suivante : find . -type f ! -regex '.*/[ -.0-~]*' -delete après avoir auparavant vérifié sans -delete que les fichiers corrects étaient bien apparier !

1voto

XTL Points 690

Il semble que votre problème soit lié à la différence d'affichage des caractères dans le terminal et le Finder. Je vous suggère d'aller dans le répertoire où se trouve l'un des fichiers que vous voulez supprimer et d'exécuter une commande ls pour voir si le nom du fichier dans l'environnement UNIX correspond à celui du Finder.

Je trouve la solution suggérée ci-dessus un peu confuse. Donc, ma version de la commande find se ferait en deux étapes :

find . -name "*ü*" -print
Cela afficherait les fichiers correspondants.

find . -name "*ü*" -delete
Cela supprimerait les fichiers correspondants après avoir vérifié que aucun des fichiers dont vous avez besoin n'est répertorié dans l'affichage précédent.

Vous devriez également prendre en compte les divers paramètres d'environnement LC_* impliqués ici, comme le mentionne @Harald Hanche-Olsen, et l'effet que cela a sur la commande find. Sans oublier les paramètres d'encodage d'affichage du Terminal.

0 votes

Merci pour la réponse @ismail, cependant ces commandes de recherche ne semblent pas correspondre à mes fichiers malheureusement.

0 votes

Avez-vous vérifié la cohérence des noms de fichier entre Finder et Terminal.app?

0voto

Sung Points 9172

Vous pouvez essayer une autre méthode en utilisant 'A better Finder Rename' (Lien). Il offre l'avantage d'une fenêtre de prévisualisation, de préréglages et d'actions en plusieurs étapes. Vous pouvez utiliser l'essai gratuit pour expérimenter.

Capture d'écran

0 votes

Merci @J.C. semble être un bon programme, mais je n'en ai finalement pas eu besoin!

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X