Je dois supprimer tous les dossiers d'un dossier à l'aide d'un script quotidien. Le dossier de ce jour doit être laissé.
Le dossier 'myfolder' a 3 sous-dossiers: 'test1', 'test2' et 'test3' Je dois tout supprimer sauf 'test2'.
J'essaie de faire correspondre le nom exact ici:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
OU
find /home/myfolder -type d ! -name 'test2' -delete
Cette commande essaie toujours de supprimer également le dossier principal «mon dossier»! Y a-t-il un moyen d'éviter cela?
!
opérateur:\!
ou'!'
.Réponses:
Cela supprimera tous les dossiers à l'intérieur
./myfolder
sauf que./myfolder/test2
et tout son contenu sera conservé:Comment ça fonctionne
find
démarre une commande find../myfolder
indique à find de commencer par le répertoire./myfolder
et son contenu.-mindepth 1
pour ne pas correspondre./myfolder
, juste les fichiers et répertoires en dessous.! -regex '^./myfolder/test2\(/.*\)?'
indique à find d'exclure (!
) tout fichier ou répertoire correspondant à l'expression régulière^./myfolder/test2\(/.*\)?
.^
correspond au début du nom du chemin. L'expression(/.*\)?
correspond soit (a) à une barre oblique suivie de quoi que ce soit ou (b) à rien du tout.-delete
indique à find de supprimer les fichiers correspondants (c'est-à-dire non exclus).Exemple
Considérez une structure de répertoire qui ressemble à;
Nous pouvons exécuter la commande find (sans
-delete
) pour voir à quoi cela correspond:Nous pouvons vérifier que cela a fonctionné en regardant les fichiers qui restent:
la source
-prune
laisser lestest2/*/
sous-répertoires seuls: revenir àrm -r
et ajouter-maxdepth 1
../myfolder
. Vous avez besoin d'un (IMvhO) manquant-type d
pour les répertoires uniquement .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
Utilisation de bash :
Exemple:
la source
tl; dr
Supprimez l'écho si vous êtes satisfait de la liste des fichiers.
L'utilisation
-mindepth 1
garantit que le répertoire supérieur n'est pas sélectionné.Mais
-not -name test2
va pas éviter subdirs à l' intérieurtest2
:Pour ce faire, vous avez besoin de quelque chose comme du pruneau:
Mais ne l'utilisez pas
delete
, comme cela impliquedepth
et cela commencera à s'effacer du chemin le plus long:Soit utiliser
rm -rf
(supprimer leecho
si vous voulez réellement effacer):Ou, utilisez également
maxdepth
si tout ce dont vous avez besoin est de supprimer des répertoires (et tout ce qu'il contient) (supprimez leecho
pour effacer réellement):Un
-delete
échouera toujours si le répertoire n'est pas vide:la source
Si vous utilisez zsh, vous pouvez:
la source
Testé avec la commande ci-dessous et cela a bien fonctionné
la source
-mindepth 1
) fait que le répertoire supérieur correspond à tous les critères (c'est un répertoire et il n'est pas nommé "test2") et donc il est supprimé.