11 votes

Supprimer un dossier contenant de nombreux fichiers

Je ne suis même pas sûr de savoir comment poser cette question correctement, mais permettez-moi d'essayer.

Je suis sur Mojave 10.14.

J'ai trouvé un répertoire dans ma corbeille qui est extrêmement lent à supprimer. Lorsque j'essaie d'aller dans le répertoire, le finder affiche un filage en bas et n'affiche pas les fichiers qu'il contient. J'ai attendu plus de 10 minutes.

Lorsque j'essaie d'utiliser "ls" cmd dans le terminal, cela prend également plus de 10 minutes et n'affiche rien.

Lorsque j'essaie de vider la corbeille, c'est EXTRÊMEMENT lent. Le nombre de fichiers supprimés augmente de 1 par seconde (ou presque). J'ai attendu plus de 30 minutes et ce n'était toujours pas terminé.

Comment diagnostiquer ce problème et trouver une solution ?

Mise à jour 1 : Le système de fichiers est APFS et le répertoire contient plus de 12 000 000 de petits fichiers json. Mise à jour 2 : J'ai finalement compté le nombre de fichiers et la taille totale du répertoire. Le répertoire contient 22 203 359 fichiers et 27.59GB.

4voto

Nick DeVore Points 4424

Unix.stackexchange.com m'a dit un jour que rsync était le moyen le plus rapide de supprimer de nombreux fichiers :

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

Cela peut être utile ici.

2voto

Kerry Jones Points 145

Lorsque j'essaie d'utiliser "ls" cmd dans le terminal, cela prend également plus de 10 minutes et n'affiche rien.

  1. Ce n'est pas normal. Quelque chose ne va pas. Je pense que la cause la plus probable est un mauvais système de fichiers ou un disque défaillant. Bien que cela soit surprenant, il pourrait s'agir d'un mauvais emplacement sur le disque à l'endroit où se trouve le répertoire. Dans le cas d'un disque défaillant, MacOS tente plusieurs lectures pour voir s'il peut récupérer les données.

    /Applications/Utilitaires/Disk Utility

Allez dans l'onglet Premiers secours. Si vous rencontrez des problèmes, vous devrez démarrer dans le gestionnaire de récupération. commande + r au moment du démarrage avant le bip. cliquez sur l'onglet utilitaires et sélectionnez l'utilitaire de disque.

Utilitaire de disque de High Sierra

enter image description here

Utilitaire de disque de Yosemite

enter image description here

  1. Essayez de démarrer en toute sécurité. C'est toujours une bonne idée d'essayer le mode sans échec lorsque des choses étranges se produisent.

    Arrêtez votre machine. Maintenez la touche Majuscule enfoncée. Mise sous tension. Le démarrage sera plus long que d'habitude car le système de fichiers du disque de démarrage est vérifié et réparé si nécessaire. Tout sur le mode sans échec, y compris les fonctionnalités et les applications que le mode sans échec ne prend pas en compte. Le démarrage sans échec utilise un pilote logiciel au lieu d'utiliser la mémoire vive de votre machine. http://support.apple.com/kb/ht1455

2voto

nohillside Points 82672

La suppression d'un grand nombre de fichiers de la Corbeille via Finder/Corbeille vide peut parfois être très lente. Il peut être plus facile/rapide d'exécuter

rm -r ~/.Trash

dans Terminal (au moins, il ne bloquera pas partiellement l'interface utilisateur).

PS : Si les fichiers à supprimer se trouvent sur un disque externe, vous devez les supprimer à partir de /Volumes/VOLNAME/.Trash au lieu de cela.

1voto

benwiggy Points 21125

22 millions de fichiers à 1 milliseconde chacun prendront plus de 6 heures.

Je ne sais pas si c'est une estimation réaliste du temps unitaire, mais le Finder n'est traditionnellement pas le plus efficace pour les opérations sur les fichiers.

Et je ne ferais pas confiance à son "pr h

Y

-2voto

Adi Points 1105

Même des outils "simples" comme rm sont en fait plusieurs milliers de lignes de code et comportent des fonctions compliquées qui les ralentissent. En outre, presque tous les systèmes de fichiers ne sont pas conçus pour contenir un grand nombre de fichiers dans un seul répertoire (10 000 est une limite supérieure raisonnable ou 1 000 si l'on utilise un navigateur de fichiers à interface graphique).

Voici un simple script qui utilise les API UNIX de bas niveau ( unlink() y rmdir() ) pour supprimer chaque élément du répertoire, en utilisant la commande nftw() pour parcourir le répertoire.

Il suffit de l'enregistrer dans un fichier texte, de le rendre exécutable et de l'exécuter. Je m'attends à ce qu'il soit très rapide, même avec 22 millions de fichiers.

#!/usr/bin/swift

import Foundation

let path = "/Path/To/Folder"

nftw(path, { child, _, type, _ in
    if (type == FTW_F) { // file
      unlink(child)
    } else if (type == FTW_DP) { // directory "where we have visited children"
      rmdir(child)
    } else if (type == FTW_SL || type == FTW_SLN) { // symlink
      unlink(child)
    } else { // anything else, assume some kind of permission issue or similar
      print("Cannot delete \(String(cString: child!))")
      return 1 // error
    }
    return 0 // no error
  },
  42, // how many file descriptors should we use?
  FTW_PHYS | FTW_DEPTH // do not follow symlinks and do a "depth first" scan (files are provided before their parent dir)
)

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