web-dev-qa-db-fra.com

Comment puis-je supprimer les fichiers contenant un nombre «3» ou «2» dans leur nom de fichier?

J'essaie actuellement de supprimer certains fichiers. Les fichiers que je veux supprimer contiennent le numéro 3 ou 2, les deux ou l’un d’eux.

Comment puis-je supprimer les fichiers contenant ces numéros?

Les fichiers sont nommés comme suit:

K-0_0_1_1_1_1_1_0.wav
K-0_0_1_1_1_1_1_1.wav
K-0_1_0_0_0_0_0_0.wav
K-0_1_0_0_0_0_0_1.wav
K-0_1_0_0_0_0_1_0.wav
K-0_0_0_0_0_0_0_2.wav
K-0_0_0_0_0_0_0_3.wav
K-0_0_0_0_0_0_1_2.wav

Dans cette liste, les trois derniers fichiers doivent être supprimés.

5
I am not Fat

Pour le répertoire en cours, vous pouvez utiliser:

rm -- *[23]*

Si vous souhaitez le restreindre, ne mettez en correspondance que les fichiers dont les 2 ou 3 doivent se situer entre K et .wav:

rm K*[23]*.wav

Si vous voulez rendre cela plus sûr en forçant rm à demander confirmation pour chaque fichier, utilisez l'indicateur interactif -i:

rm -i K*[23]*.wav

Remarques

  • shell glob * correspond à n'importe quel nombre (y compris zéro) de tous les caractères
  • dans le shell [some chars] est une classe de caractères - tout élément à l'intérieur peut correspondre
  • -- est reconnu par rm comme fin des options. Cela évite les erreurs si l'un des noms de fichiers commence par -; sinon le nom de fichier peut être interprété comme une option

Si vous devez éviter de faire correspondre le 22, le 23, le 32, le 33, vous aurez besoin de quelque chose d'un peu plus complexe, comme réponse d'AFSHIN .

20
Zanna

Vous pouvez utiliser les globes Shell:

rm *2* *3*

Cela supprimera tous les fichiers (et non les répertoires) du répertoire de travail en cours auxquels correspondent l'un des globs *2* ou *3*.

Dans ces globes, "* signifie toujours" n'importe quel nombre (y compris zéro) de n'importe quel caractère ".

Notez cependant que les globs de IIRC Bash ne correspondent pas aux fichiers cachés (nom de fichier commençant par .) par défaut.

8
Byte Commander

Pour le répertoire actuel ou tout autre emplacement:

  1. Exécutez ceci pour voir ce qui doit être supprimé:

    find . -type f -iname "*[32]*.wav" 
    
  2. Puis supprimez avec:

    find . -type f -iname "*[32]*.wav" -delete
    

Plus d'information:

  • . signifie le répertoire en cours, pourrait également être le chemin d'accès à l'emplacement du fichier, comme /path/to/files
  • Pour empêcher find de se déplacer dans n’importe quel répertoire de la cible prévue, utilisez l’option -maxdepth 1, d’où:
    • find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete
  • Si vous êtes dans le répertoire cible, utilisez:
    • find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete

CAUTION

Ne faites jamais ceci find . -delete -type f -iname "*[32]*.wav" sinon tous (vos fichiers) seront supprimés!

5
George Udosen

Bien que les réponses données suppriment également les fichiers, y compris *23*, *32*, *2*3*, *3*2*, *2* ou *3* modèles de fichiers + , cette réponse avec rm *2* *3* solution essaiera de supprimer un fichier K-0_0_0_0_3_0_1_2.wav deux fois et seconde fois try échouera car il est supprimé par le modèle correspondant *2* !.

Pour les éviter, vous trouverez ci-dessous une commande qui ne renvoie que des fichiers contenant le 2 ou le 3 ou les deux noms répétés une seule fois.

find . -type f -name "*[^0-9][2|3][^0-9]*" #-delete

Ou dans rm, vous pouvez utiliser les éléments suivants à la place.

rm -- *[^0-9][23][^0-9]*
2
αғsнιη

Je suis fan de xargs, qui permet un aperçu avant d'exécuter The Command:

$ echo *2* *3*
(list of files with 2 or 3 in name)

Il ne s’agit que du test de globalisation du shell (fonctionne sous bash). Si la liste est correcte, dirigez-la vers xargs:

$ echo *2* *3* | xargs rm -v

L'option -v répertorie les fichiers rm est en cours de suppression. Vous pourriez être plus paranoïaque et ajouter l’option -i à -v pour qu’elle soit invitée à chaque suppression.

0
brass