Comment puis-je supprimer tous les fichiers avec une extension particulière dans un dossier particulier?

36

Si je définis le répertoire en cours / de travail (en y accédant à l'aide de cd) vers un répertoire particulier, puis tapez:

rm *.xvg

Que fera cette commande? Est-il vrai que la commande ci-dessus ne supprimera que les fichiers portant l'extension .xvg uniquement dans le répertoire de travail?

J'avais peur d'essayer cela avant de demander, parce que je veux être absolument sûr que la commande ci-dessus ne supprimera que les .xvgfichiers SITUÉS DANS LE RÉPERTOIRE DE TRAVAIL .

Andrew
la source

Réponses:

34

Oui, rm *.xvgva seulement supprimer les fichiers avec l'extension spécifiée dans votre actuelle répertoire.

Un bon moyen de vous assurer que vous êtes bien dans le répertoire dans pwdlequel vous souhaitez supprimer vos fichiers consiste à utiliser la commande qui affiche votre répertoire actuel, puis lsà vérifier que vous avez trouvé les fichiers que vous attendez.

Si vous avez un peu peur d'exécuter la rmcommande, vous pouvez faire 2 choses:

  1. tapez ls *.xvgpour voir une liste des fichiers qui seraient affectés par cette commande.

  2. Sauf si vous avez beaucoup de fichiers, vous pouvez toujours utiliser le -icommutateur de ligne de commande pour rm(existe également pour cpet mv). L'utilisation rm -i *.xvgvous inviterait à supprimer chaque fichier individuel pour chaque fichier, de sorte que vous puissiez être sûr que rien de ce que vous ne pensiez être supprimé ne soit supprimé. (Ce sera fastidieux si vous avez beaucoup de fichiers :)

Levon
la source
1
Aussi: rm -f {*.xvg,.*.xvg}supprimer aussi les fichiers cachés. Et rm -R -f {*.xvg,.*.xvg}pour supprimer aussi les répertoires.
Dor
20

Vous n'avez pas besoin de naviguer dans le répertoire, utilisez simplement

rm /some/dir/*.xvg 

Dans le cas où vous avez une faute de frappe ou une erreur similaire dans le chemin, où / som / dir n'existe pas:

cd /som/dir
rm *.xvg

supprimera accidentellement tous les fichiers .xvg du répertoire en cours. La première commande ne le fera pas, et vous n’avez pas besoin de recoder.

Une autre manière serait d'utiliser find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
Utilisateur inconnu
la source
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete a fonctionné pour moi! utilisez -maxdepth "n" pour supprimer les fichiers correspondants du sous-répertoire si le chemin est
spécifié
3

Oui, rm *.xvgne supprimera que les fichiers se terminant par .xvgvotre répertoire actuel. Voici pourquoi.

Lorsque vous tapez une commande comme celle-ci, le travail est divisé entre le shell que vous utilisez (supposons bash) et la commande binaire.

Vous pouvez localiser le binaire en tapant which rm. Ce petit programme s'occupe de dissocier les fichiers. Des programmes comme celui-ci peuvent être démarrés à partir de la ligne de commande et peuvent lire une liste d'arguments prog arg1 arg2 arg3au démarrage. Dans le cas de rm, ils sont interprétés comme une liste de noms de fichiers complets à supprimer. Donc, si vous êtes dans un répertoire contenant le fichier foo.bar, la saisie delete 'foo.*'aboutira à rm: foo.*: No such file or directory. Notez les guillemets simples autour du modèle de fichier, ils disent au shell de transmettre l'argument au shell tel qu'il est.

Toutefois, si vous tapez rm *.bardans le même répertoire, le fichier sera supprimé. Ce qui se passe ici, c'est que votre shell, qui est le programme que vous utilisez pour taper des commandes, effectue certaines transformations avant de transmettre les arguments à la commande. L'un d'eux s'appelle 'extension de nom de fichier', autrement dit 'globbing'. Vous pouvez voir une liste des extensions de noms de fichiers bash ici . L’une des extensions les plus courantes est celle *qui est étendue aux noms de fichiers du répertoire en cours.

Un moyen simple de voir les globes au travail est d'utiliser echo, qui affiche tous les arguments qui lui sont transmis via le shell. Donc, en tapant echo *dans le même répertoire va sortir foo.bar. Ainsi, lorsque vous tapez rm *.bar, le shell étend la liste des arguments foo.bar, puis le transmet à la rmcommande.

Il y a des moyens de contrôler le globbing. Dans les versions récentes de bash, par exemple, vous pouvez activer une option appelée globstar qui effectuera une expansion récursive. En tapant, vous echo **/*.barverrez une liste de tous les fichiers se terminant .barpar tous les sous-dossiers. Donc, en tapant rm **/*.bardans globstar enabled bash supprimera effectivement de manière récursive tous les fichiers correspondants dans les sous-dossiers.

purzelrakete
la source
1

Commande:

  rm ./*.pgm

travaille pour moi

Commander:

rm *.pgm

donne une commande d'erreur (en polonais, traduit):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

dans

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Adam
la source