Supprimer tous les fichiers aléatoires sauf 1 000 dans un répertoire
Code :
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
Explication :
- Répertorier tous les fichiers dans
/path/to/dir
avecfind
;print0
:utilisez\0
(caractère nul ) comme délimiteur de ligne ; afin que les chemins de fichiers contenant des espaces/nouvelles lignes ne cassent pas le script
- Mélangez la liste des fichiers avec
sort
;-z
:utilisez\0
(caractère nul) comme délimiteur, au lieu de\n
(une nouvelle ligne)-R
:ordre aléatoire
- Supprimez les 1 000 premières lignes de la liste aléatoire avec
tail
;-z
:traiter la liste comme délimitée par des zéros (comme avecsort
)-n +1001
:afficher les lignes à partir de 1 001 (c'est-à-dire omettre les 1 000 premières lignes)
xargs -0 rm
- supprimer les fichiers restants ;-0
:délimité par des zéros, encore une fois
Pourquoi c'est mieux que la solution de Quixotic* :
- Fonctionne avec les noms de fichiers contenant des espaces/nouvelles lignes.
- N'essaie pas de créer des répertoires (qui existent peut-être déjà, d'ailleurs)
- Ne déplace aucun fichier, ne touche même pas les 1000 "fichiers chanceux" en plus de les lister avec
find
. - Évite de manquer un fichier en cas de sortie de
find
ne se termine pas par\n
(nouvelle ligne) pour une raison quelconque.
* - crédit à Don Quichotte pour | sort -R | head -1000
, m'a donné un point de départ.