![Iterieren Sie über Dateien mit aufsteigendem, aber nicht zusammenhängendem Nummernbereich im Namen](https://rvso.com/image/192250/Iterieren%20Sie%20%C3%BCber%20Dateien%20mit%20aufsteigendem%2C%20aber%20nicht%20zusammenh%C3%A4ngendem%20Nummernbereich%20im%20Namen.png)
Der Dateiname enthält ein Muster der Form 00035023030
, das sich nur in den letzten beiden Ziffern von ...30
bis ändert ...35
. Wenn jedoch eine Zahl von bis fehlt , 30
wie 35
z. B. 31
, wird der Fehler ausgegeben. Wie kann man diesen Fehler umgehen und die folgende Befehlsliste in einer Schleife ausführen?
Hier barycorr
ist das Programm, das von mir drei Eingaben verlangt:
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/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 vonstart
bis erweitertend
:$ echo {00035023030..00035023033} 00035023030 00035023031 00035023032 00035023033
Dies for variable in something
ist eine For-Schleife und sie setzt den Wert der Variablen ( $num
in 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.evt
dasw$numxwtw2po_cl_bary.evt
die Shell nicht wissen könnte, dass der Name der Variablen lautet$num
und nicht$numxwtw2po_cl_bary.evt
.if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
: Hiermitif
wird einfach geprüft, ob alle drei Dateien vorhanden sind. Dies-e
prüft, ob die Datei vorhanden ist. Diesif
ist also nur dann erfolgreich, wenn alle drei Dateien vorhanden sind.