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.

IroeN
la source

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.

StarNamer
la source
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).

Gilles 'SO- arrête d'être méchant'
la source
J'utilise bash.
IroeN
1
@ user6554: ... que ni votre question ni les balises utilisées n'indiquent;)
0xC0000022L
3

Vous pouvez courir rm */*dans/var/myfolder

Dinesh
la source
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 {} +
mikeserv
la source
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
vison
la source
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/*/*.

Edgar Naser
la source
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.

rjh427
la source
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 *

keyur bhatt
la source