web-dev-qa-db-fra.com

Comment supprimer n fichiers aléatoires du répertoire?

J'ai un répertoire de téléchargement et je veux supprimer 1000 images aléatoires de celui-ci. Comment puis-je faire cela avec commande?

Je suis capable de supprimer single avec rm mais cela a pris longtemps .. Y at-il un moyen de supprimer en bloc sur ubuntu?

2
Hasan Tıngır
find /uploads -maxdepth 1 -type f -name "*.jpg" -print0 | \
        head -z -n 1000 | xargs -0 rm

La commande find trouve tous les fichiers (-type f) nommés *.jpg (-name "*.jpg") dans le répertoire /uploads et ne rentre PAS dans les sous-répertoires (-maxdepth 1 ) (ce qu’il fait habituellement). Il imprime ensuite les noms de fichier avec \0 comme séparateur entre les deux. Cela est nécessaire car les noms de fichiers peuvent contenir des caractères étranges (comme des espaces et autres).

Cette sortie est introduite dans la commande head. Il lit les 1000 premières "lignes" (-n 1000) qui sont séparées par \0 (-z).

Finalement, ces 1000 "lignes" (= noms de fichiers) sont introduites dans xargs qui s'attend également à ce que les "lignes" soient séparées par \0 (-0), puis exécute rm. avec toutes ces 1000 lignes comme paramètres.


Si vous voulez seulement prévisualiser le résultat, changez la commande en

find /uploads -maxdepth 1 -type f -name "*.jpg" -print0 | \
    head -z -n 1000 | xargs -0 echo rm

c'est-à-dire remplacer xargs … rm par xargs … echo rm. Peut-être aussi remplacer le 1000 par 10 pour la prévisualisation.


Clause de non-responsabilité: je ne sais pas comment les fichiers imprimés par find sont triés, mais au moins, il ne s'agit pas d'un attribut apparent (comme le nom ou l'âge) et apparence = aléatoire. Si vous voulez vraiment sélectionner 1 000 fichiers aléatoires, vous devez insérer un sort -R pour trier de manière aléatoire (à nouveau avec -z pour le délimiteur \0):

find /uploads -maxdepth 1 -type f -name "*.jpg" -print0 | \
    sort -z -R | head -z -n 1000 | xargs -0 rm
3
PerlDuck