Effacement de fichiers dans une arborescence, en conservant les dossiers

Chrisdfr

Membre confirmé
4 Décembre 2012
96
4
Bonjour,

J'ai un dossier qui contient toute une arborescence de sous dossiers, avec dans chacune des fichiers.

Est ce qu'il existe un moyen d'effacer les fichiers et uniquement les fichiers contenus dans tous ces sous dossiers mais en conservant les dossiers, qui resteront donc vides. Au final, on devrait se retrouver avec une arborescence de dossiers vides.

Merci
Christine
 
Bonjour Christine.

Je te propose une commande dans le «Terminal» pour ce faire, mais je t'invite à faire au préalable une copie de ton dossier afin d'exercer la commande sur cette copie pour vérifier si elle produit exactement ce que tu attends (chez moi, ça marche : effacement des fichiers / conservation des dossiers). C'est une commande de la forme :

Bloc de code:
find /chemin_au_dossier/nom_du_dossier -type f -name '*' -exec rm {} \;

[Elle consiste à invoquer le programme find (trouve), à lui fournir l'adresse de sa cible : /---, à renseigner le type d'objet à chercher : -type f (fichiers) et leurs noms : '*' (tous les intitulés) ; et à enchaîner avec -exec (= exécuter sur le produit de la rechercher précédente) une 2è commande : rm (remove = supprime) portant sur le lot : {} avec indication de fin de séquence \;]

Voici comment la passer concrètement dans ton contexte : tu vas à Applications/Utilitaires et tu lances le «Terminal». Dans la fenêtre ouverte, tu te contentes d'abord de taper
Bloc de code:
find
et tu sautes un espace avec la barre d'espacement.

Cela fait, tu vas en-dehors de la fenêtre du «Terminal» à ton dossier (sa copie d'abord) via le Finder et avec le pointeur tu fais carrément un glisser-déposer du dossier dans la fenêtre du «Terminal» - ce qui renseigne automatiquement le chemin au dossier et le nom du dossier (l'équivalent déterminé de mon /chemin_au_dossier/nom_du_dossier). Un saut d'espace se crée automatiquement à la fin.

Tu complètes la commande par copier-coller direct de -type f -name '*' -exec rm {} \; dans la fenêtre du «Terminal» ou a la mano (au choix) et ↩︎ (tu presses la touche "Entrée" du clavier pour activer la commande) --> attends le ré-affichage de l'invite de commande ton_nom$ dans la fenêtre en signe de complétion de l'opération. Il ne te reste plus qu'à vérifier, et, si tu es satisfaite, à récidiver sur l'original et à jeter la copie, ou à jeter l'original et à renommer la copie.
 
Dernière édition par un modérateur:
Salut.

La commande find dans le terminal est ton ami.
Je te donne 2 commandes.
La première pour lister ce qui sera supprimé.
La seconde qui fera le travail.
Attention à bien respecter la syntaxe.
Commande 1:
find répertoire-début -type f -exec ls {} \;
Commande 2:
find répertoire-début -type f -exec rm {} \;

Voilà ça devrait marcher.
Edit: grilled (pas facile le smartphone) :)
 
Juste pour raffiner vos suggestions, ne serait-il pas plus prudent de déplacer les fichiers vers la corbeille avec la commande "move" plutôt que de les supprimer directement avec la commande "remove" ?
 
Merci pour vos réponse, ça marche très bien.

Pour ma culture générale, j'ai survolé rapidement le Man de find mais je ne suis pas encore très familiarisée avec les enchaînements de commandes. Je pensais qu'il fallait un "tube" pour exploiter le résultat du find. Et il faut encore que je comprenne l'utilisation des accolades et de l'antislash...

En tout cas encore merci
 
Pour les accolades : elles sont remplacées par le résultat de la commande find (le nom du fichier trouvé)
Quand au signe \ c'est simplement pour indiquer au shell de ne pas interpréter le signe qui suit. En l'occurrence le ; qui indique la fin de la commande find. Voilà. :)
 
Petite incise : si on a vraiment beaucoup de fichiers à supprimer, on peut utiliser une petite variante de la commande, qui permet de regrouper les invocations à la sous-commande (ici rm).
Bloc de code:
find /chemin_au_dossier/nom_du_dossier -type f -exec rm {} +
(on remplace le point-virgule par un plus, sans besoin de le faire précéder d'un anti-slash)