Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/10/2023, à 05:52

bubu75

[RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Bonjour, je veux supprimer disons toutes les images jpeg d'un dossier, j'ai déjà trouvé comment le faire via son extension.
Ce fut avec de longues heures de recherches, je n'exagère pas 5 ou 10 heures peut-être, car les commandes et moi ça fait 2, et je ne suis même pas sûr que la commande soit très correcte mais elle marche parfaitement ça suffit à mon bonheur.
D'abord je me place dans le dossier visé:

cd /mon-dossier

Puis:

find \( -iname "*.jpg" \) -print0 | xargs -0 rm -f

Et paf mourrus les jipègues.
Je pense comprendre les autres termes, mais je n'ai aucune idée de ce que signifient -print0 ni xargs ni -0, et je n'ai pas l'intention de l'apprendre aujourd'hui ni cette semaine car j'ai malheureusement un peu d'autres choses à faire en ce moment.

Ce qui suit est peut-être plus ou moins faux atttention ne pas trop s'y fier.

  • find: la commande qui cherche. Attention elle est récursive par défaut, donc s'appliquera sur les sous-dossiers éventuels même sans lui demander avec -R.

  • -iname: le paramètre pour cibler par leur nom les éléments recherchés (-name tout court est sensible à la casse, mais -iname non, ce qui perment de cibler aussi les .JPEG,  ou par exemple les .Jpeg si par hasard ils existaient).

  • *.jpeg: * est le joker qui dit "n'importe-quel nombre de n'importe-quel caractère", ce qui a pour résultat de cibler "tous les noms de fichiers finissant par une extension .jpeg".

  • |: "pipe" en anglais, dit que le résultat de la commande précédente est donné à la commande suivante.

  • rm: "remove", = supprime.

  • -f: "force", force la suppression, pas de demande de confirmation, ou de mesure de sécurité, ou un truc dans le genre.


*
Je voudrais la même commande mais qui au lieu de cibler le jpeg via son extension, le fasse via son "type MIME" si c'est le bon terme (il semble par exemple que le bon terme soit plutôt "type de medias" d'après Wikipedia). Ainsi le jpeg est supprimé même s'il n'a pas d'extension ou une mauvaise.

Le type MIME des jpeg serait image/jpeg, c'est un bon début on avance. smile
Mais ensuite, j'ai cherché une ou 2 heures, mais je ne trouve pas. J'aurais espéré quelque chose comme

find \( -mimetype "image\/jpeg" \) -print0 | xargs -0 rm -f 

mais ça ne semble pas aussi simple.
C'est vraiment dans un but pratique, même si je ne comprends rien aux termes de la commande je m'en fiche un peu, c'est pour une tâche qui me semble très simple en soi, mais quelle commande pour faire cela??

Dernière modification par bubu75 (Le 25/10/2023, à 13:30)

Hors ligne

#2 Le 09/10/2023, à 07:08

Nasman

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Tu recherches les extensions .jpeg et tu mets "*.jpg" dans ta commande ?


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#3 Le 09/10/2023, à 08:08

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Salut,

find ne semble pas proposer d'option basée sur le mimetype.

Il faut donc que tu boucles sur tous les fichiers et que tu testes leur mimetype avec la commande du même nom.
Si le mimetype est le bon, tu supprimes le fichier.

Un truc du genre quoi :

while read -d '' Fichier
do
  [[ $(mimetype --output-format %m "$Fichier") == "image/jpeg" ]] && echo rm "$Fichier"
done < <(find . -type f -print0)

La commande find te remontera tous les fichiers et sous-fichiers.
S'il te ressort les bonnes lignes, tu peux virer le echo.

Dernière modification par Hizoka (Le 09/10/2023, à 08:26)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 09/10/2023, à 14:14

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Nasman a écrit :

Tu recherches les extensions .jpeg et tu mets "*.jpg" dans ta commande ?

Oui en effet dans ma commande j'ai écrit ".jpg" au lieu de ".jpeg" alors que je dis bien ".jpeg" ensuite!
Petite erreur pardon. Je n'avais pas du tout à l'esprit les 2 manières possibles d'écrire cette extension, j'ai mis .jpeg partout, sauf un .jpg dans la commande, je ne sais pas trop pourquoi (la bière peut-être).

Ensuite si on veut être + précis, je dis au début que je veux supprimer "toutes les images jpeg", ou aussi, quand je dis "un jpeg" (sans le .), je le dis comme un nom commun, "une chaussure", "une chaussette", etc. "Un jpeg" étant juste "une image au format jpeg".
De par là, si je veux encore être + précis pour ne pas dire vicieux, si je veux viser "les jpeg" dans une commande, je peux indiquer .jpg ET .jpeg, car on peut assez couramment rencontrer chacun, et ils sont strictement égaux pour le mimetype qu'ils indiquent (c'est assez connu je crois). En fait non je DOIS le faire a priori pour ne pas risquer d'en manquer pas mal (mais bon les jpeg c'était juste un exemple j'aurais pu dire les vidéos-au-format-truc ou les wma). Mais encore également d'après une page Mozilla si j'ai compris, je peux ajouter encore 3 autres, et la commande devient:

find \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.jfif" -o -iname "*.pjpeg" -o -iname "*.pjg" \) -print0 | xargs -0 rm -f

Mais de façon courante je suppose que les 2 premières extensions doivent suffire.

En tout cas je découvre une 3ème raison possible de vouloir supprimer via le mimetype: ne pas laisser passer des fichiers parce qu'ils ont une extension correcte mais rare/inconnue.

Dernière modification par bubu75 (Le 25/10/2023, à 13:35)

Hors ligne

#5 Le 09/10/2023, à 14:16

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Hizoka a écrit :

Salut,

find ne semble pas proposer d'option basée sur le mimetype.

Il faut donc que tu boucles sur tous les fichiers et que tu testes leur mimetype avec la commande du même nom.
Si le mimetype est le bon, tu supprimes le fichier.

Un truc du genre quoi :

while read -d '' Fichier
do
  [[ $(mimetype --output-format %m "$Fichier") == "image/jpeg" ]] && echo rm "$Fichier"
done < <(find . -type f -print0)

La commande find te remontera tous les fichiers et sous-fichiers.
S'il te ressort les bonnes lignes, tu peux virer le echo.

Ça alors une commande à laquelle je comprends rien! (Des while, des echo, des <, de qui que quoi??) Exactement ce que je recherchais, merci je n'en demandais pas tant.
Et surtout, j'ai testé, ça marche!

Merci pour les réponses.
smile

Hors ligne

#6 Le 09/10/2023, à 14:21

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Euh pardon mais finalement j'aurais encore 2 demandes, je ne mets pas encore en "RÉSOLU" en fait.


*
Comment indiquer plusieurs mimetypes dans ce genre de commande? Je sais comment faire avec find mais pas ici.

J'ai essayé d'appliquer sur les jpeg et les webp de cettes façon:

while read -d '' Fichier
do
  [[ $(mimetype --output-format %m "$Fichier") == "image/jpeg" -o "image/webp" ]] && echo rm "$Fichier"
done < <(find . -type f -print0)

et

while read -d '' Fichier
do
  [[ $(mimetype --output-format %m "$Fichier") == "image/jpeg" -o $(mimetype --output-format %m "$Fichier") == "image/webp" ]] && echo rm "$Fichier"
done < <(find . -type f -print0)

Ils ne marchent pas.


*
Je ne veux pas avoir l'air exigeant, mais la commande me semble lente!
En fait je crains qu'elle soit inutilisable en conditions réelles pour moi.

Mon dossier de tests a 80 fichiers, et seulement 3 ne sont pas des jpeg, 1 .webp, et 2 .html.
Je passe la commande donnée, et il faut environ 12 secondes pour que l'action soit réalisée!
C'est le temps pour que le terminal montre "fini", et c'est bien aussi ce que je constate en regardant dans mon gestionnaire de fichiers Nemo les fichiers disparaître un par un progressivement.
Alors qu'avec la commande find (et extensions .jpg + .jpeg), c'est simplement instantané.
Là c'est seulement sur 80 fichiers, en conditions réelles ça serait sur des centaines ou des milliers, ou des centaines de milliers, impossible.

Peut-être (??) que la commande lit tout le fichier et qu'il faudrait la limiter à la 1ère ligne? Je crois avoir lu des histoires de ce genre.
Sinon tant pis, mais a priori en l'état je ne pourrais vraiment pas utiliser cette commande.

Hors ligne

#7 Le 09/10/2023, à 15:59

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

while read -d '' Fichier
do
  MimeType=$(mimetype --output-format %m "$Fichier") 
  [[ "${MimeType}" == @(image/jpeg|image/webp) ]] && echo rm "$Fichier"
done < <(find . -type f -print0)

Oui elle est longue car il teste le mimetype de tous les fichiers que renvoie find.

du coup, il faut travailler sur le find pour limiter le nombre d'élément envoyé à la boucle.
avec une limite de profondeur de dossier, une gestion de taille min ou max...

Perso, il met 1min pour 1000 fichiers avec genre 900 png et 100 jpg.

Le find ne traite que les fichiers correspondants et n'execute pas de mimetype dessus.
Il est donc beaucoup plus rapide...

Dernière modification par Hizoka (Le 09/10/2023, à 16:01)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#8 Le 09/10/2023, à 16:05

Watael

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

les accolades sont superflues, et les guillemets très facultatifs.

[[ $MimeType == image/@(jpeg|webp) ]]

-print0 +1
smile

ps: n'oubliez pas de bien stipuler dans le shebang d'utiliser bash !

Dernière modification par Watael (Le 09/10/2023, à 16:06)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 09/10/2023, à 16:12

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Il semble plus rapide de faire un truc du genre :

mimetype --output-format "%f:->%m" * | grep ":->image/jpeg"

Mais :
Il n'aime pas les caractères spéciaux, pas compris pourquoi.
Ce n'est pas recursif (sauf à faire un système qui va dans les sous dossiers quand il rencontre un inode/directory)

Et il faudrait sûrement utiliser l'option -M de mimetype au vu de ta demande :

    -M, --magic-only
        Do not check for extensions, globs or inode type, only look at the
        content of the file. This is particularly useful if for some reason
        you don't trust the name or the extension a file has.

Dernière modification par Hizoka (Le 09/10/2023, à 16:14)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 09/10/2023, à 18:20

lynn

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Je rajoute ici une petite commande qui n'est pas très souvent citée et pourtant bien utile dans ce genre de script pour remplacer « rm ».

gio trash ...

Elle permet d'utiliser la corbeille. Même après finalisation d'un script, quand il s'agit d'éliminer, potentiellement plusieurs centaines voire plusieurs milliers de fichiers, je pense que l'idée d'un dernier contrôle visuel avant suppression définitive, n'est pas forcement incongrue.

Mais bon, on peut aimer vivre dangereusement... tongue


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#11 Le 09/10/2023, à 21:30

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Je me la suis notée smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#12 Le 18/10/2023, à 21:11

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Bonne nouvelle je crois, quelqu'un, je ne sais pas qui c'est mais je le félicite, quel génie smile, a posé la même question sur le forum anglophone Stackexchange Unix & Linux.
https://unix.stackexchange.com/question … mime-type#
(Grrrmm plein de trucs googleapis.com etc sur ce site, obligé de les autoriser temporairement dans NoScript.)

Une meilleure commande m'a été donnée a priori!
Je n'y comprends goutte, mais elle semble fonctionner et être pas mal plus rapide.

find . -type f -exec file -00 --mime-type {} + |
  perl -0lne '$file = $_; chomp($type = <>);
              print $file if $type =~ m{^image/(webp|jpeg)\z}' |
  xargs -r0 echo rm

(Avec echo pour test, enlever echo pour l'appliquer réellement, mais alors "gio trash" semble être une alternative de sécurité aussi!)

Sur un dossier de tests avec 2600 fchiers (.webp, .jpg, .html et .zip.html), Hizoka ta commande du post #7 a pris 8:45 minutes (celle du post #3 avait pris 9:45 minutes), contre 2:05 minutes pour celle de StackExchange, grosse différence même si je suis toujours à me dire que peut-être quelque part il existe une commande aussi rapide ou presque que find+extensions.

Pffff après des heures passées sur le sujet j'en ai marre mais si quelqu'un a mieux je suis toujours preneur.
Merci aux réponses!


Edit:
En relisant la page, je crois que je n'ai pas testé la solution du post #9.
Mais les 2 problèmes possibles indiqués, caractères spéciaux et non-récursif, vont sûrement faire que je ne vais pas essayer en fait finalement, tant pis.
En effet l'option -M aurait été utile si elle évitait de regarder les extensions, sur l'autre forum un inscrit m'avait donné une commande encore plus rapide, mais sauf erreur elle filtrait d'abord par extensions, puis dans ce résultat elle regardait les mimetypes, chose que je ne veux vraiment pas, pour pouvoir viser les fichiers sans extension ou avec extension erronée ou rare/inconnue.

Dernière modification par bubu75 (Le 25/10/2023, à 13:41)

Hors ligne

#13 Le 19/10/2023, à 07:55

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

En effet c'est vraiment plus rapide...
c'est étonnant à quel point le perle est plus rapide qu'un grep.

Pour explication :
Il fait un find et exécute la commande file --mime-type sur tous les fichiers en une fois et non à chaque fois.
Le séparateur utilisé par file et \0.
Le résultat est passé à perl qui n'affichera que les fichiers ayant pour type des images.
Le résultat est passé à xargs qui exécute rm


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#14 Le 19/10/2023, à 08:14

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

et cette commande ?

shopt -s extglob; file -00 --mime-type **/* | perl -0lne '$file = $_; chomp($type = <>);
              print $file if $type =~ m{^image/(webp|jpeg)\z}' |
  xargs -r0 echo rm

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#15 Le 22/10/2023, à 15:55

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

La commande ne fait rien du tout, il doit y avoir une petite erreur dedans je suppose.

Hors ligne

#16 Le 22/10/2023, à 18:28

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Perso, elle fonctionne bien, elle s’exécute très rapidement.

grâce à shopt -s extglob, on se passe de find.

C'est une commande bash.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#17 Le 23/10/2023, à 16:18

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Ouf je ne comprenais rien car la situation restait la même malgré plusieurs modifications un peu au hasard (passer en root, enlever le echo, enlever les sauts à la ligne de la commande...).
Mais apparemment la commande ne voit pas "les fichiers de son dossier", car elle a finalement fonctionné mais j'ai dû créer pour cela un sous-dossier dans le dossier de tests pour y placer les 2600 fichiers. Cette fois oui elle a fonctionné, elle a mis 02:07, ce qui est ± la même chose que la commande de StackExchange qui mettait 2:05 (je l'ai même re-testée sur ce dossier de tests "en sous-dossier", elle a mis 01:48 cette fois, différence mineure).

Mais, saperlipopette, encore un rebondissement!
Puis en fait je refais un test dans un autre dossier des tests qui en plus comprend des sous-sous-dossiers (et sous-sous-sous...), et en passant cette commande (shopt etc), elle ne voit qu'1 fichier .webp, qui est dans un simple "sous-dossier", or la commande de StackExchange voit ce fichier mais aussi tous les autres placés "moins et plus profond" quant à elle. Chez moi en tout cas, elle ne voit donc a priori que ce qui est présent dans un sous-dossier.

*
Petit rajout (qui ne change pas grand-chose).
En ayant recommencé un test 10 ou 20 minutes plus tard avec les 2 commandes, Hizoka 01:04, StackExchange 00:44. Un temps divisé par 2 pour les deux, j'imagine plusieurs explications possibles qui viennent à l'esprit tout de suite mais je ne saurais pas trop les démêler avec certitude (le fait d'être en début de session avec des ressources peu chargées ayant sans doute une importance).

Dernière modification par bubu75 (Le 25/10/2023, à 13:13)

Hors ligne

#18 Le 23/10/2023, à 17:34

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

En effet, je pensais que la commande faisait toute l'arbo mais ce n'est pas le cas...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#19 Le 25/10/2023, à 13:28

bubu75

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Merci d'avoir essayé!
Je passe le sujet en [RÉSOLU], j'espère toujours mieux je l'avoue mais peut-être que ce qu'on m'a donné est au top, en tout cas c'est utilisable sur par exemple mon petit /home à 172 000 éléments (avec du cache de navigateurs ça monte vite à 500 000). Mon envie de se rapprocher de find+extensions super-rapide est peut-être impossible, c'est une tâche trop différente probablement.

Dernière modification par bubu75 (Le 26/10/2023, à 17:35)

Hors ligne

#20 Le 25/10/2023, à 17:34

Watael

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

shopt -s extglob; file -00 --mime-type ./**/* | perl ...

la différence est subtile, mais essentielle. big_smile


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#21 Le 25/10/2023, à 17:44

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

Ca ne change rien, il ne descend pas...
shopt -s extglob; file --mime-type ./**/*
on voit clairement qu'il ne recherche que dans un sous dossier, ni le dossier actuel ni un sous-sous-dossier


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#22 Le 25/10/2023, à 18:00

Watael

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

si, si. J'ai bien sûr fait le test, avec ./ je vois bien aussi les fichiers directement sous ./.

Dernière modification par Watael (Le 25/10/2023, à 18:00)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#23 Le 25/10/2023, à 19:42

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

find *
3.jpg
animaux
animaux/.cover.jpg
animaux/3.jpg
animaux/animaux
animaux/animaux/.cover.jpg
animaux/animaux/3.jpg
animaux/animaux/animaux
animaux/animaux/animaux/.cover.jpg
animaux/animaux/animaux/3.jpg
shopt -s extglob; file --mime-type ./**/*
./animaux/3.jpg:   image/jpeg
./animaux/animaux: inode/directory

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#24 Le 25/10/2023, à 20:28

Watael

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

que te dire ?
si tu positionnes extglob au lieu de globstar... !

lol je n'avais pas fait attention au #14


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#25 Le 26/10/2023, à 08:01

Hizoka

Re : [RÉSOLU]Cherche commande pour supprimer des fichiers par leur mimetype

En effet... ça marche mieux avec la bonne option big_smile

Merci


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne