Mon répertoire de niveau supérieur est data
. data
comprend plusieurs répertoires et ces répertoires ont des sous-répertoires. J'ai besoin de supprimer tous les fichiers et répertoires à l'intérieur, data/
sauf plusieurs fichiers dans certains répertoires.
Par exemple, les données incluent les répertoires 100
et 101
. Je veux juste garder a.txt
et les b.txt
fichiers 100/
et c.txt
et les d.txt
fichiers 101/
tout en supprimant tous les autres fichiers et répertoires 100
et 101
.
Exemple:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
J'utilise la rm -rf !(a.txt|b.txt)
commande mais je ne peux pas appliquer cette commande automatiquement pour chaque répertoire.
la source
rm
savoir quels fichiers conserver dans quels répertoires si vous ne souhaitez pas le spécifier.Vous pouvez l'utiliser
find
pour cela. Vous pouvez annuler les testsfind
avec-not
ou!
. Cela exclura les correspondances, plutôt que de les trouver.Vous devez faire attention à ne supprimer aucun des répertoires parents des fichiers que vous souhaitez conserver, en particulier le répertoire actuel
.
, assurez-vous donc de lire attentivement la sortie avant de supprimer.Sur la base de votre exemple, vous pouvez faire quelque chose comme ça depuis le
data
répertoire.Ajoutez un
! -path ./path/to/dir
pour tout chemin que vous souhaitez éviter de supprimer. Vous pouvez utiliser des métacaractères comme*
, mais assurez-vous de citer l'expression si vous le faites, par exemple"./path*dir"
, pour empêcher toute expansion indésirable.find
est récursif par défaut. Même si nous ne le trouvons pas./100
ici, nous trouverons tout son contenu à moins qu'il ne corresponde au modèle[ab].txt
. Si vous ne pouvez pas faire correspondre tous les noms que vous souhaitez conserver, ajoutez un autre test:Cela ne trouvera pas
a.txt
oub.txt
oufoo
, mais il trouvera tous les autres fichiers.Lorsque vous êtes sûr de voir ce que vous voulez, vous pouvez ajouter
-delete
à la fin pour supprimer les fichiers trouvés:la source