Etwas late to the party, aber das:
rklm schrieb:
| for d in caption/*/*/; do
for f in "$d"*.out; do
test -e "$f" || ( cd "$d"; qsub *.job )
break
done
done
|
sieht mir nicht sehr effizient aus, codezeilenmäßig. Wieso 2 Schleifen?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
t201:~/proj/mini/forum/xx > tree
.
├── a
│ └── cur
├── b
│ └── cur
│ └── x.out
└── c
└── cur
6 directories, 1 file
t201:~/proj/mini/forum/xx > for d in {a..c}/cur; do test -f $d/*.out || (cd $d; pwd) ; done
/home/stefan/proj/mini/forum/xx/a/cur
/home/stefan/proj/mini/forum/xx/c/cur
|
Also übersetzt in die richtigen Pfad- und Programmnamen:
| for d in caption/Iso{1..18}_Cd2Se2/Iso*_Cd2Se2_ezdpp
do
test -f $d/*.out || (cd $d; qsub *.job)
done
|
Die Doppelpipe || sorgt dafür, dass das rechts davon nur ausgeführt wird, wenn der linke Teil gescheitert ist, also keine solche Datei existiert. Die runden Klammern (cd $d; qsub *.job) führen das Eingeklammerte in einer Subshell aus, so dass man danach wieder da ist, wo man vorher war, auch wenn das cd ... scheitert.
Ich muss aber noch etwas generelles loswerden.
In der Shell tippt man ungerne lange Pfadnamen wiederholt, also
| cp furchtbar/langer/pfadname/a furchtbar/langer/pfadname/b
|
sondern lieber
| cd furchtbar/langer/pfadname
cp a b
cd -
|
In einem Script schreibt man aber meist besser
| d=furchtbar/langer/pfadname
cp $d/a $d/b
|
denn beim Hin- und Herhüpfen in Verzeichnissen können Dinge schiefgehen.
Vieles davon ist sicher eher theoretisch, etwa dass man in ein Verzeichnis von heute auf morgen nicht mehr reindarf oder dass das Verzeichnis gelöscht wurde. Wenn das Skript dafür nicht gewappnet ist, in dem es den Erfolg des Verzeichniswechsels überprüft hat oder durch einen Automatismus das Zurückspringen an das Reinspringen gekoppelt hat, kann übles passieren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | t201:~/proj/mini/forum/xx > tree
.
├── a
│ └── cur
├── b
│ └── cur
│ └── x.out
└── c
└── cur
t201:~/proj/mini/forum/xx > chmod a-x c
t201:~/proj/mini/forum/xx > for d in {a..c}/cur; do test -f $d/*.out || (cd $d; pwd; cd -; pwd ) ; done
/home/stefan/proj/mini/forum/xx/a/cur
/home/stefan/proj/mini/forum/xx
/home/stefan/proj/mini/forum/xx
bash: cd: c/cur: Keine Berechtigung
/home/stefan/proj/mini/forum/xx
/home/stefan/proj/mini/forum
/home/stefan/proj/mini/forum
|
Hier sind wir jetzt ein Verzeichnis zu hoch gelandet. Ich kenne jetzt Deine Daten nicht, ob da andere Verzeichnisse benachbart sind, die .job-Dateien enthalten, die womöglich unerfreuliche Ergebnisse erzeugen würden.
Absolute Pfade wären ein Hilfsmittel dagegen, aber einerseits bläht das den Code weiter auf, zweitens sind Scripte, die verschnupft auf Verschiebungen reagieren auch eine Fehlerquelle. Man kopiert die Verzeichnisstruktur nach woanders, wo man das gleiche tun will, und dann arbeitet das Script, dass unter /montag/caption war in /mittwoch/caption nicht, weil es die .out-Datei unter /montag/... gefunden hat.
Dagegen hilft eine Variable des Pfads am Anfang des Scripts, so dass man dieses nur einmal, an einer Stelle, anpassen muss, und es auch gleich bei einem flüchtigen Blick sieht.
Wenn qsub seine .out-Datei in das aktuelle Verzeichnis schreibt, dann hilft es aber nix, man muss das Verzeichnis wechseln (oder die .out-Datei nachträglich verschieben, was auch nicht eleganter ist). Bei Programmen, die die Ein- und Ausgabe parametrisieren lassen, würde man lieber
| nichtQsub $d/*.job --output-dir=$d
|
schreiben, aber das ist natürlich nur ab und an gegeben.