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.
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
*
correspond à n'importe quel nombre (y compris zéro) de tous les caractères[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 optionSi 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 .
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.
Pour le répertoire actuel ou tout autre emplacement:
Exécutez ceci pour voir ce qui doit être supprimé:
find . -type f -iname "*[32]*.wav"
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
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
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!
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]*
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.