Liste des fichiers avec des caractères génériques UNIX

14

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

Matt Keene
la source
Pour référence: correspondance de motifs , globbing
ignis

Réponses:

20

Vous pouvez utiliser l'extension d'accolade:

ls mjk00{25..50}.fits

Des zéros non significatifs peuvent être inclus si nécessaire:

ls mjk0{000..149}.fits
chepner
la source
1
En utilisant cette syntaxe, vous pouvez également spécifier une valeur de pas: {25..50..2}.
nobar
1

Pas directement, mais vous pouvez utiliser plusieurs modèles glob:

ls mjk002[56789].fits mjk00[34]?.fits

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.

Celada
la source
1

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:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

Je ne sais pas si c'est possible et comment éventuellement généraliser cela avec grep.

Heisenbug
la source
0

Il peut être possible d'obtenir une plus grande portabilité ou flexibilité en utilisant une forboucle et printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Cela gère bien les espaces et les résultats sont bien adaptés à la tuyauterie xargspour 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 ||truesupprime un retour d'erreur au niveau bash.


Dans le cas de base, cependant, l'utilisation de foret printfn'est pas différente de la plus concise:

ls --escape mjk{0025..0050..1}* ||true
nobar
la source
Si vous souhaitez séparer les résultats de l'expansion de l'accolade, vous pouvez utiliser une boucle for:for i in {025..050} ; do ... ; done
nobar