Vous pourriez avoir une situation où vous souhaitez supprimer plusieurs fichiers qui ont une extension particulière. Ce tutoriel vous aidera à faire exactement cela.
Vous utilisez la commande rm pour supprimer des fichiers et des dossiers de la manière suivante :
rm [option] filename
Il peut sembler que vous ayez besoin de connaître les noms de fichiers exacts ici, mais ce n'est pas vrai.
Laissez-moi vous montrer quelques méthodes pour supprimer plusieurs fichiers en fonction de leur extension de fichier.
Méthode 1 :supprimer des fichiers par extension à l'aide de la commande rm
Dans mon exemple, j'ai un tas de fichiers gif qui se terminent par des extensions .gif.
Pour les supprimer, je peux utiliser la commande rm comme ceci :
rm *.gif
Supprimer des fichiers aveuglément comme ça pourrait être risqué. Il est toujours bon de voir d'abord quels fichiers seront supprimés à l'aide de la commande ls :
ls *.gif
Voici comment je supprime les fichiers avec l'extension .gif :
$ ls
1.gif 2.gif 3.gif 4.gif a.jpg b.png c.webp
$ ls *.gif
1.gif 2.gif 3.gif 4.gif
$ rm -v *.gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
$ ls
a.jpg b.png c.webp
Cela peut être fait pour n'importe quelle extension de fichier, pas seulement .gif. Vous pouvez même combiner plusieurs extensions.
$ ls
f1.txt f2.txt f3.txt f4.txt not-txt-file.pdf random.txt
$ rm -v *.txt *.pdf
removed 'f1.txt'
removed 'f2.txt'
removed 'f3.txt'
removed 'f4.txt'
removed 'not-txt-file.pdf'
$ ls
random.txt
💡Vous pouvez utiliser l'option interactive -i avec la commande rm qui demande de confirmer avant de supprimer chaque fichier. Cependant, cela peut ne pas être pratique si vous avez de nombreux fichiers à supprimer. Vous vous demandez comment ça marche ? Caractères génériques !
En un mot, un caractère générique est un caractère spécial que vous utilisez pour correspondre à un modèle particulier. Vous trouverez ci-dessous quelques caractères génériques fréquemment utilisés :
Wilcard | Utiliser |
---|---|
* | Mettre en correspondance une ou plusieurs occurrences |
? | Mettre en correspondance une seule occurrence |
[] (Crochets) | Spécifiez une plage de correspondance |
^ | Exclure de la correspondance |
Vous avez utilisé le caractère générique * ici, ce qui signifie qu'il peut correspondre à une ou plusieurs occurrences de n'importe quel caractère.
Quand vous dites *.gif
, cela signifie toute combinaison de lettres menant à .gif
. En d'autres termes, il vous donne tous les fichiers avec l'extension .gif
.
Chaque caractère générique peut être utilisé en plus d'un autre caractère générique. Mais n'entrons pas dans ces détails pour le moment.
Ce point entre * et l'extension est important !
Beaucoup de gens commettent l'erreur de confondre le *.gif
avec *gif
. Ça n'est pas correct. Le point (.) entre * et le nom de l'extension est crucial.
Prenez le scénario avec les fichiers suivants et regardez ce qui se passe lorsque j'utilise la regex *gif
au lieu de *.gif
:
$ ls
1.gif 2.gif 3.gif 4.gif definately-not-a-gif jpg-not-gif not-a-gif
$ rm -v *gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
removed 'definately-not-a-gif'
removed 'jpg-not-gif'
removed 'not-a-gif'
Il a également supprimé les fichiers avec la chaîne gif
dedans, même si ce n'était pas l'extension du fichier, il y avait juste gif à la fin du nom de fichier sans le point précédent.
Lorsque vous supprimez des fichiers contenant des caractères génériques ou des expressions régulières, assurez-vous d'être aussi précis que possible.
Méthode 2 :supprimez de manière récursive les fichiers avec une extension particulière à l'aide de la commande find
La commande rm supprime uniquement les fichiers du répertoire courant. Il ne supprime pas les fichiers des sous-répertoires, même avec l'option récursive.
Pour supprimer récursivement des fichiers avec une extension particulière, vous pouvez combiner la commande find et la commande rm :
Voici un exemple où j'ai également des fichiers .gif dans les sous-répertoires.
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
Pour supprimer les fichiers, vous pouvez utiliser la commande find comme ceci :
find . -type f -name "*.gif" -exec rm -v {} \;
Voici le résultat lorsque j'ai exécuté la commande :
$ find . -type f -name "*.gif" -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir3/file_3.gif'
removed './dir2/file_2.gif'
removed './file_0.gif'
removed './dir4/file_4.gif
Décomposons-le.
- Le point après "rechercher" signifie rechercher dans le répertoire courant
- Le drapeau "-name" spécifie le nom du fichier, où nous pouvons utiliser regex
- Le drapeau "-exec" est utilisé pour exécuter une commande bash sur le résultat de la commande find
- Les accolades "{}" agissent comme espace réservé pour le résultat du ou des fichiers correspondants, donc "rm -v {}" supprimera les fichiers trouvés par la commande find.
- Enfin, le point-virgule termine la commande exécutée par votre shell (la commande après exec) et la barre oblique inverse '\' est utilisée pour que le point-virgule soit correctement échappé. Vous ne devriez pas vous en soucier.
Vous pouvez découvrir plus d'exemples de la commande de recherche dans le didacticiel ci-dessous.
Astuce bonus avancée :utilisez la commande find pour travailler sur des fichiers avec plusieurs extensions
La commande ci-dessus ne couvre pas la recherche de fichiers avec plusieurs extensions, quelque chose comme "rm *.gif *.txt"
Pour y parvenir, vous pouvez utiliser le -o
argument qui signifie 'opérateur OU logique'. Mais nous devons également utiliser la barre oblique inverse '\' pour échapper aux parenthèses
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
$ find . \( -name "*.gif" -o -name "*.txt" \) -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir1/file_a.txt'
removed './dir3/file_3.gif'
removed './dir3/file_c.txt'
removed './dir2/file_2.gif'
removed './dir2/file_b.txt'
removed './file_0.gif'
removed './file_z.txt'
removed './dir4/file_d.txt'
removed './dir4/file_4.gif'
Ici, vous pouvez voir que tous les fichiers avec une extension 'txt' et les fichiers avec une extension 'gif' sont supprimés, de manière récursive.
Je sais que vous aurez envie d'utiliser la commande de recherche séparément pour chaque type d'extension de fichier serait plus facile et vous ne vous trompez pas.
Conclusion
Cet article a couvert la suppression de fichiers avec une extension particulière. Nous avons également examiné la recherche et la suppression récursives de ces fichiers.
"Avec un grand pouvoir, viennent de grandes responsabilités" , souvenez-vous-en lorsque vous utilisez des caractères génériques et des expressions régulières. Une erreur de frappe et des fichiers importants peuvent être supprimés involontairement.