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?
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