Iterieren Sie über Dateien mit aufsteigendem, aber nicht zusammenhängendem Nummernbereich im Namen

Iterieren Sie über Dateien mit aufsteigendem, aber nicht zusammenhängendem Nummernbereich im Namen

Der Dateiname enthält ein Muster der Form 00035023030, das sich nur in den letzten beiden Ziffern von ...30bis ändert ...35. Wenn jedoch eine Zahl von bis fehlt , 30wie 35z. B. 31, wird der Fehler ausgegeben. Wie kann man diesen Fehler umgehen und die folgende Befehlsliste in einer Schleife ausführen?

Hier barycorrist das Programm, das von mir drei Eingaben verlangt:

  1. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
  2. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
  3. /home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz

Die Skriptdatei, die ich für die jeweilige Ausführung erstellt habe:

echo -e "/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023030/auxil/sw00035023030sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl.evt
/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023031/auxil/sw00035023031sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023033/sw00035023033xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023033xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

Antwort1

Ihr Skript wird nicht angehalten und führt alle Befehle aus. Sie müssen den Fehler nur ignorieren. Sie können es jedoch tatsächlich so einrichten, dass fehlende Dateien übersprungen werden. Sie könnten Ihr Skript beispielsweise wie folgt umschreiben (unter der Annahme, dass Bash Version 4 oder neuer ist, für die Null-Auffüllung in der Klammernerweiterung):

#!/bin/bash

for num in {00035023030..00035023033}; do
    dir=/home/dinesh/Test/output"${num}"
    file1="$dir/sw${num}xwtw2po_cl.evt"
    file2="$dir/sw${num}xwtw2po_cl_bary.evt"
    file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"

    if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
        printf '%s %s %s' "$file1" "$file2" "$file3" | 
            barycorr ra=253.467570 dec=39.760169 &>>log
    else
        echo "Some files missing for $num" >> log
    fi
done

Erläuterung

  • for num in {00035023030..00035023033}; do: die {start..end}Notation heißt „Klammernerweiterung“ und wird auf alle Zahlen von startbis erweitert end:

    $ echo {00035023030..00035023033}
    00035023030 00035023031 00035023032 00035023033
    

Dies for variable in somethingist eine For-Schleife und sie setzt den Wert der Variablen ( $numin diesem Fall ) auf jedes der „Etwas“. Das bedeutet, dass diese Schleife die Zahlen von 00035023030 bis 0035023033 durchläuft.

  • Innerhalb der Schleife richten wir einfach einige Variablen ein, um das Schreiben sehr langer Namen zu vermeiden und alles übersichtlich zu halten. Wir haben also:

     dir=/home/dinesh/Test/output"${num}"
     file1="$dir/sw${num}xwtw2po_cl.evt"
     file2="$dir/sw${num}xwtw2po_cl_bary.evt"
     file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"
    

    ${num}ist erforderlich, damit die Shell Dinge wie verstehen kann, sw${num}xwtw2po_cl_bary.evtda sw$numxwtw2po_cl_bary.evtdie Shell nicht wissen könnte, dass der Name der Variablen lautet $numund nicht $numxwtw2po_cl_bary.evt.

  • if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then: Hiermit ifwird einfach geprüft, ob alle drei Dateien vorhanden sind. Dies -eprüft, ob die Datei vorhanden ist. Dies ifist also nur dann erfolgreich, wenn alle drei Dateien vorhanden sind.

verwandte Informationen