Disons par exemple que j'ai les fichiers suivants dans mon répertoire de travail: mjk0001.fits, mjk0002.fits, ... augmentant numériquement jusqu'à mjk9999.fits.
Existe-t-il un moyen d'utiliser des caractères génériques UNIX pour répertorier ou opérer sur un groupe séquentiel d'entre eux? Par exemple, si j'ai besoin d'exécuter un processus sur 0025 à 0050, quel format utiliserais-je?
J'ai essayé ce qui suit mais je n'ai pas réussi:
ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*
Merci d'avance à tous, MK
bash
unix
command-line
ls
Matt Keene
la source
la source
Réponses:
Vous pouvez utiliser l'extension d'accolade:
Des zéros non significatifs peuvent être inclus si nécessaire:
la source
{25..50..2}
.Pas directement, mais vous pouvez utiliser plusieurs modèles glob:
Ce n'est pas exactement ce que vous recherchez, mais c'est la chose la plus proche qu'offrent les modèles glob, et c'est certainement mieux que de taper chaque système de fichiers. Au moins le nombre de modèles dont vous aurez besoin par plage numérique est délimité par le journal des points de terminaison numériques de la plage.
la source
Vous pouvez utiliser une expression régulière avec grep. Je ne suis pas un gourou des regex. Ce qui suit renvoie le modèle avec les nombres entre 25 et 50:
Je ne sais pas si c'est possible et comment éventuellement généraliser cela avec grep.
la source
Il peut être possible d'obtenir une plus grande portabilité ou flexibilité en utilisant une
for
boucle etprintf
:Cela gère bien les espaces et les résultats sont bien adaptés à la tuyauterie
xargs
pour un traitement ultérieur.Les nombres avec plusieurs correspondances entraîneront la liste de tous les fichiers correspondants.
Les nombres sans correspondance rapporteront une erreur sur stderr, mais le
||true
supprime un retour d'erreur au niveau bash.Dans le cas de base, cependant, l'utilisation de
for
etprintf
n'est pas différente de la plus concise:la source
for i in {025..050} ; do ... ; done