web-dev-qa-db-fra.com

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

Dites par exemple, j'ai les fichiers suivants dans mon répertoire de travail: mjk0001.fits, mjk0002.fits, ... augmente numériquement tout le chemin à 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 je dois exécuter un processus sur 0025 à 0050, quel format dois-je utiliser?

J'ai essayé ce qui suit mais n'ai eu aucun succès:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Merci d'avance tout le monde, mk

15
Matt Keene

Vous pouvez utiliser une regex avec Grep. Je ne suis pas un gourou de regex. Ce qui suit renvoie le modèle avec les chiffres 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 a finalement généraliser cela avec Grep.

1
Heisenbug

Il peut être possible d'obtenir une plus grande portabilité ou une plus grande flexibilité en utilisant une boucle forprintf:

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 pour xargs pour un traitement ultérieur.

Les numéros avec plusieurs correspondances entraîneront tous les fichiers correspondants répertoriés.

Les numéros sans correspondance signaleront une erreur sur STDRERR, mais le ||true supprime un retour d'erreur au niveau de bash.


Dans le cas de base, cependant, en utilisant for et printf n'est pas différent de celui plus concis:

ls --escape mjk{0025..0050..1}* ||true
0
nobar