Je laisse un script de génération de données s'exécuter trop longtemps maintenant avoir plus de 200 000 fichiers dont j'ai besoin à environ 1000. À partir de la ligne de commande Linux, existe-t-il un moyen facile de supprimer tous sauf 1000 de ces fichiers, où les fichiers qui seraient conservés n'aurait aucune dépendance sur le nom de fichier ou tout autre attribut?
13
Réponses:
Supprimer tous les fichiers, sauf 1 000, dans un répertoire
Code:
Explication:
/path/to/dir
avecfind
;print0
: utiliser\0
( caractère nul ) comme délimiteur de ligne; donc les chemins de fichiers contenant des espaces / sauts de ligne ne cassent pas le scriptsort
;-z
: utiliser\0
(caractère nul) comme délimiteur, au lieu de\n
(une nouvelle ligne)-R
: ordre aléatoiretail
;-z
: traite la liste comme délimitée par zéro (comme avecsort
)-n +1001
: afficher les lignes à partir de 1001 (c.-à-d. omettre les 1000 premières lignes)xargs -0 rm
- supprimer les fichiers restants;-0
: délimité par zéro, encore une foisPourquoi c'est mieux que la solution de Quichotic *:
find
.find
ne se termine pas par\n
(nouvelle ligne) pour une raison quelconque.* - crédit à quixotic pour
| sort -R | head -1000
, m'a donné un point de départ.la source
find . -type f | sort -R | tail -n +1001 | xargs rm
find
? Je vais essayer d'améliorer ma réponse, j'ai juste besoin de quelques commentaires pour travailler avec.tail: invalid option -- 'z'
la version de la queue que j'ai est 8.4Utilisez un répertoire temporaire, puis
find
tous vos fichiers, randomisez la liste avecsort
et déplacez les 1000 premiers de la liste dans le répertoire temporaire. Supprimez le reste, puis replacez les fichiers dans le répertoire temporaire.Si se
xargs
plaint de la longueur de la ligne, utilisez un plus petit nombre avechead
et répétez la commande au besoin (c. -à- changement-1000
à-500
et exécuter deux fois, ou le changement-200
et l' exécuter 5 fois.)Il échouera également à gérer les noms de fichiers qui incluent des espaces; comme le montre la réponse de @ rld , vous pouvez utiliser
find
l'-print0
argument de, les-z
arguments verssort
ethead
, et-0
avecxargs
pour garantir une gestion correcte du nom de fichier.Enfin, si le
tmp-dir
existe déjà, vous devez remplacer un nom de répertoire qui n'existe pas.la source
find
inclut un espace.Pour les utilisateurs de mac, le script suivant devrait faire l'affaire.
tr
permettra à sort et tail de travailler sur des listes avec\n
au lieu de\0
.la source
Le plus simple pourrait être de rm -rf le répertoire, puis réexécutez le script de génération de données tout en veillant à ne pas s'exécuter trop longtemps.
la source