Comment supprimer uniquement le contenu des répertoires?


14

Je suis dans un dossier: /var/myfolder .

À l'intérieur, il y a d'autres dossiers comme: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/ etc.

À l'intérieur de chacun, il y a des fichiers avec des noms aléatoires. Comment supprimer tous les fichiers de tous les dossiers à l'intérieur/var/myfolder ?

La structure (tous les répertoires, par exemple, A, B, C, etc., à l'intérieur /var/myfolder) doit rester intacte.

Réponses:


17

Essayer:

find /var/myfolder -type f -delete

Cela obtient tous les fichiers normaux sous / var / monfolder et les supprime en ne laissant que les répertoires.


Merci pour la solution. J'aurais dû mentionner que je fais cela dans Solaris 9, donc ma recherche n'a pas l'option -delete, mais c'est un bon point de départ.
IroeN

2
J'ai pu trouver la solution suivante: find / var / myfolder -type f -exec rm -f {} \;
IroeN

2
Pardon. J'utilise Debian ou Ubuntu. Pour autant que je sache, votre solution est équivalente.
StarNamer

6
-type f! =! -type d
mikeserv

7

Avec zsh, utilisez le . qualificatif glob pour faire correspondre uniquement les fichiers normaux:

rm -- **/*(.)

Cela supprime récursivement tous les fichiers réguliers (non masqués) du répertoire actuel et ses sous-répertoires. Ajoutez le Dqualificatif glob pour supprimer également les fichiers réguliers masqués (et les fichiers normaux dans les répertoires masqués).


J'utilise bash.
IroeN

1
@ user6554: ... que ni votre question ni les balises utilisées n'indiquent;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm ne supprime pas les répertoires - il suffit donc de l'exécuter sur tout.

Pour conserver les liens symboliques vers les répertoires:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

Et je pense que cela devrait également fonctionner de manière légèrement optimisée s'il y a beaucoup de fichiers qui pourraient avoir besoin de tests dans la version ci-dessus:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

Notez que GNU finda une -xtypeoption pour cela.
Stéphane Chazelas

@ StéphaneChazelas - ast le fait aussi. mais je n'avais pas du tout besoin de profondeur, je ne pense pas. je l'ai gardé dans le top pour éviter autant d'appels d'erreur - silencieux ou pas - mais c'était juste idiot dans les autres.
mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

Le supprimera tout ce qui se trouve dans les sous-dossiers sans toucher aux sous-dossiers eux-mêmes.

La première *est pour les sous - répertoires de myfolderlui - même ( A, B...). Le second *est pour les fichiers dans A,B etc.

S'il y a plus de dossiers à l' intérieur A, Betc. Exécutez d' abord: rm /var/myfolder/*/*/*puis exécutez rm /var/myfolder/*/*.


0

Vous devriez également être en mesure de cd en haut de l'arborescence de répertoires en question, puis exécutez:

find . -type f -print0 | xargs -0 rm -rf

et cela devrait supprimer tous les fichiers tout en laissant intacte l'arborescence des répertoires. Les options -print0 et -0 peuvent être omises si vous êtes sûr de ne pas avoir de noms de fichiers ou de répertoires contenant des espaces.

La commande find fait la distinction entre les fichiers (-type f) et les liens (-type l), ce qui devrait laisser les liens intacts, le cas échéant. Non testé cependant. En cas de doute, exécutez:

trouver . -type l

et voyez si quelque chose apparaît avant d'exécuter la commande find précédente.


Pouvez-vous expliquer comment le rmdrapeau -r, -R, --recursive - remove directories and their contents recursivelys'inscrit dans tout cela?
Stephen Rauch

Parce que nous n'exécutons pas rm -rf, nous exécutons find. -tapez f, puis redirigez la sortie de celle-ci vers rm -rf. Donc, il supprime uniquement les fichiers, il ne touche pas les répertoires. Voilà ce que le | Le bit xargs le fait, il prend la sortie de la commande de gauche et l'envoie à la commande de droite.
rjh427

Mon point exactement. Si vous ne passez aucun répertoire, à quoi sert un drapeau qui ne fonctionne que sur les répertoires?
Stephen Rauch

Parce que la mémoire musculaire, et ça marche toujours. Vous pourriez soulever la même objection sur l'option -f "force", je vous donnerais la même réponse.
rjh427

-2

Utilisez simplement la commande ci-dessous:

sudo rm -rf directory_in_which_you_have_content / *

---------------- OU --------------------------------- -----------------------

Le '*' est synonyme de tous, donc quand vous utiliserez * cela supprimera tout le contenu. Donc, utilisez la commande comme celle-ci ou allez dans le répertoire dans lequel vous souhaitez supprimer tout le contenu et utilisez simplement la commande ci-dessous:

sudo rm -rf *

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.