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/diravecfind;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
findne 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.