Est-ce que 'fichiers rm *' supprime toutes les correspondances de tous les sous-répertoires?

13

Je veux supprimer tout fichier qui ressemble wordpress-891.sqlau répertoire actuel (pas à l'intérieur des sous-répertoires).

Fera rm wordpress-*.sqll'astuce ou supprimera-t-il également les correspondances des sous-répertoires?

HorusCoding
la source
1
En passant, alors que toutes les autres réponses finissent par être correctes, il y a une autre torsion: c'est en fait bash, pas la commande rm, qui étend le caractère générique. Si vous avez dix fichiers correspondants dans votre répertoire, rm ne verra pas le caractère générique, mais plutôt dix arguments individuels. Si vous voulez que rm fasse l'expansion, vous devez mettre votre argument entre guillemets simples. Pour rm, cela ne fait aucune différence, mais dans certains autres contextes, cela peut le faire. Habituellement, lorsque le caractère générique fait référence à autre chose que des fichiers, tels que les packages apt-get.
Kevin Keane
3
@KevinKeane, rmne fait pas d'extension de nom de fichier ... rm "foo*"essaierait de supprimer un fichier avec un astérisque littéral dans le nom.
ilkkachu

Réponses:

20

Non Globulation normale * n'est pas récursive et elle ne l'est pas non plus rm.

Si un nom de répertoire correspond, il ne sera pas supprimé - vous avez besoin du -r drapeau pour supprimer un répertoire.

Il est donc prudent de le faire si vous êtes sûr de vouloir supprimer ces fichiers.

Vous pouvez également rendre rminteractif

rm -i wordpress-*.sql

puis il vous demandera une confirmation avant de supprimer chaque fichier

Zanna
la source
14

Oui, il fait l'affaire pour vous et supprime tous les fichiers avec ce schéma dans le répertoire actuel. Et NON, il ne supprime pas les fichiers dans les sous-répertoires.

Chaque fois que vous n'êtes pas sûr de ce qui se passe lorsque vous exécutez une commande comme:

rm wordpress-*.sql

puis lancez-le en utilisant ls:

ls wordpress-*.sql

les fichiers que vous voyez en sortie sont ceux qui seront supprimés.

Lorsque vous essayez d'obtenir une liste comme:, foo*il est préférable d'utiliser le -dcommutateur avec lspour éviter de répertorier les fichiers contenant un répertoire nommé foobar/etc.

ls -d foo*

Cette astuce fonctionne pour les commandes qui ne sont pas utilisées pour effectuer le travail de manière récursive.

L'autre chose que vous pouvez faire est de taper votre entrée souhaitée, par exemple: wordpress-*puis appuyez sur Ctrl+ Alt+ *, et maintenant toutes les correspondances sont tapées automatiquement devant votre commande.

Ravexina
la source
4
Ma méthode préférée:printf "%s\n" wordpress-*.sql
wjandrea
1
Vous pouvez également faire comme Echo echo rm file*. -rf
Recherchez en
@eckes: Vous pouvez couvrir ceux-ci plus en toute sécurité avec rm ./*ou rm -- *.
David Foerster
Oui, ou utilisez xargs -0@DavidFoerster
eckes
si vous allez ls foo*et que vous avez un répertoire appelé foobar, vous obtenez également une liste du contenu de ce répertoire, donc plain lsn'est pas vraiment le meilleur moyen de savoir ce qu'il rmva frapper
ilkkachu
12

Non, rm ne récurrente pas via les sous-répertoires.

Voir Supprimer les fichiers correspondants dans tous les sous-répertoires - SuperUser pour les méthodes de suppression des fichiers dans les sous-répertoires.

Si vous craignez de supprimer accidentellement quelque chose d'important, utilisez gvfs-trash(qui envoie les fichiers dans la corbeille) au lieu de rm(qui supprime définitivement les fichiers).

wjandrea
la source
Merci pour la gvfs-trashmention apprise quelque chose aujourd'hui à peine l'utiliser ...
George Udosen
-1

Si vous souhaitez rechercher et supprimer tous les fichiers correspondants tels que wordpress-*.sql, vous pouvez utiliser la findcommande. :)

Par exemple, vous souhaitez supprimer tous les fichiers correspondants avec wordpress-*.sqlunder test_dir, procédez comme suit.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Chaque fois que le findprogramme trouve vraiment un fichier correspondant, il essaie d'exécuter une commande après l' -execoption. Dans ce cas, rm -f {}sera exécuté et {}sera remplacé par le nom du fichier de correspondance. Par exemple

rm -f wordpress-169.sql

Vous pouvez également définir la profondeur des sous-répertoires avec -maxdepthoption.

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Veuillez noter que vous devez spécifier l' -maxdepthoption avant les autres options. Sinon, vous pouvez obtenir les résultats que vous ne voulez vraiment pas voir.

Parc Sung-Jin
la source
1
OP veut le contraire: ne pas reculer dans les sous-répertoires.
Melebius
2
GNU find: "les options affectent tous les tests, y compris les tests spécifiés avant l'option", la liste des options ci-dessous comprend -maxdepth. Utilisez -exec rm -f {} +plutôt que -exec \;, ou mieux encore, juste-delete
ilkkachu