2 votes

Supprimer tous les fichiers qui ne sont pas au format jpeg

J'ai un exercice, dans lequel je dois supprimer tous les fichiers qui ne sont pas jpeg.

J'ai essayé find -type f |xargs file| grep -iv 'jpeg', mais cela ne fonctionne pas.

7voto

John1024 Points 15663

Suppression basée sur le type MIME du fichier

Pour supprimer tous les fichiers réguliers non-jpeg dans le répertoire actuel ou ses sous-répertoires, utilisez :

find . -type f -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;

Cette approche est sécuritaire pour tous les noms de fichiers. Elle fonctionnera même si les noms de fichiers contiennent des sauts de ligne ou d'autres caractères difficiles.

Comment cela fonctionne

  • find . -type f

    Ceci lance une commande find, en restreignant les fichiers trouvés aux fichiers réguliers, -type f.

  • -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;

    Pour tous les fichiers trouvés, cela exécute une commande bash pour tester le type de fichier. En particulier, file -bi "$1" | grep -q image/jpeg renverra vrai si file rapporte que le fichier a le type MIME image/jpeg. L'opérateur || assure que la commande rm qui suit est exécutée uniquement pour les fichiers qui ont échoué au test jpeg. Ainsi, tous les fichiers non-jpeg sont supprimés.

Suppression basée sur le nom de fichier

Pour supprimer tous les fichiers dont les noms n'ont pas pour extension .jpeg :

find . -type f ! -name '*.jpeg' -delete

Cette approche est également sécuritaire pour tous les noms de fichiers. Elle fonctionnera même si les noms de fichiers contiennent des sauts de ligne ou d'autres caractères difficiles.

Comment cela fonctionne

  • find .

    Trouve tous les fichiers dans le répertoire actuel et ses sous-répertoires

  • -type f

    Se restreindre seulement aux fichiers réguliers

  • ! -name '*.jpeg'

    -name '*.jpeg' trouverait tous les fichiers dont les noms ont pour extension .jpeg. Cependant, le point d'exclamation, !, signifie négation. Ainsi, ! -name '*.jpeg' restreint notre recherche aux fichiers dont les noms n'ont pas pour extension .jpeg.

  • -delete

    Cela indique à find de supprimer les fichiers qui correspondent aux critères ci-dessus.

Test

Pour tester la commande, enlevez le -delete :

find . -type f ! -name '*.jpeg'

Cela vous montrera quels fichiers seront supprimés lorsque l'action -delete sera utilisée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X