50 votes

Supprimer tous les fichiers d'un répertoire, à l'exception de ceux portant l'extension pdf

J'ai un répertoire qui contient les éléments suivants :

x.pdf
y.zip
z.mp3
a.pdf

Je souhaite supprimer tous les fichiers à l'exception de x.pdf y a.pdf . Comment faire cela à partir du terminal ? Il n'y a pas de sous-répertoire, donc pas besoin de récursivité.

65voto

Edward Torvalds Points 7511
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
  • La première commande vous conduira au répertoire dans lequel vous souhaitez supprimer vos fichiers
  • La seconde commande supprimera tous les fichiers à l'exception de ceux qui se terminent par .pdf dans le nom du fichier

Par exemple, s'il existe un répertoire appelé temp dans votre dossier personnel :

cd ~/temp

puis supprimer les fichiers :

find . -type f ! -iname "*.pdf" -delete

Cette opération supprime tous les fichiers à l'exception de xyz.pdf .

Vous pouvez combiner ces deux commandes pour :

find ~/temp -type f ! -iname "*.pdf" -delete

. est le répertoire courant. ! permet de prendre tous les fichiers à l'exception de ceux qui contiennent des .pdf à la fin. -type f ne sélectionne que les fichiers, pas les répertoires. -delete permet de le supprimer.

REMARQUE : cette commande supprimera tous les fichiers (à l'exception des fichiers pdf, mais y compris les fichiers cachés) dans le répertoire actuel ainsi que dans tous les sous-répertoires. ! doit précéder -name . simplement -name ne comprendra que .pdf , tandis que -iname comprendra à la fois .pdf y .PDF

Pour ne supprimer que le répertoire actuel et non les sous-répertoires, ajoutez -maxdepth 1 :

find . -maxdepth 1 -type f ! -iname "*.pdf" -delete

45voto

steeldriver Points 118154

Con bash Avec le globbing étendu de Shell, vous pouvez supprimer tous les fichiers dont l'extension est autre que .pdf en utilisant

rm -- *.!(pdf)

Comme l'a noté @pts, le -- indiquent la fin des options de la commande, rendent la commande sûre dans le cas rare de fichiers dont le nom commence par un - caractère.

Si vous souhaitez supprimer les fichiers sans aucune extension ainsi que ceux dont l'extension est différente de .pdf , alors, comme l'a souligné @DennisWilliamson, vous pourriez utiliser

rm -- !(*.pdf)

La globalisation étendue devrait être activée par défaut, mais si ce n'est pas le cas, vous pouvez le faire en utilisant la fonction

shopt -s extglob

En particulier si vous avez l'intention d'utiliser ceci à l'intérieur d'un script, il est important de noter que si l'expression ne correspond à rien (c'est-à-dire s'il n'y a pas de fichiers autres que pdf dans le répertoire), alors par défaut le glob sera passé non expansé à la commande rm La commande de l'utilisateur se traduit par une erreur du type

rm: cannot remove `*.!(pdf)': No such file or directory

Vous pouvez modifier ce comportement par défaut à l'aide de la fonction nullglob Shell, mais cela pose ses propres problèmes. Pour une discussion plus approfondie, voir NullGlob - Le Wiki de Greg

19voto

αғsнιη Points 33236

Supprimer vers la corbeille :

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

Ou via mv (mais de cette façon, vous ne pouvez pas le restaurer à partir de la corbeille car elle n'enregistre pas les informations .trashinfo, ce qui signifie que vous avez déplacé vos fichiers vers un fichier destination où elle se présente comme suit).

mv !(*.pdf) ~/.local/share/Trash/files

14voto

Jerry Points 141

L'approche la plus simple : Créez un autre répertoire quelque part (si vous ne supprimez que dans un seul répertoire, pas de manière récursive, il peut même s'agir d'un sous-répertoire) ; déplacez-y tous les fichiers .pdf ; supprimez tout le reste ; déplacez les fichiers .pdf à nouveau ; supprimez le répertoire intermédiaire.

Rapide, facile, vous pouvez voir exactement ce que vous faites. Assurez-vous simplement que le répertoire intermédiaire se trouve sur le même appareil que le répertoire que vous nettoyez, afin que les déplacements soient des renommages et non des copies !

4voto

Cyrus Points 4962

Utiliser GLOBIGNORE de bash :

GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE

Extrait de la page de manuel de bash :

GLOBIGNORE:

            A colon-separated list of patterns defining the set
            of filenames to be ignored by pathname expansion.

Un test rapide :

mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *

Sortie :

y.zip
z.mp3

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