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
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.
Il peut être possible d'obtenir une plus grande portabilité ou une plus grande flexibilité en utilisant une boucle for
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 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