View previous topic :: View next topic |
Author |
Message |
furanku l33t
Joined: 08 May 2003 Posts: 905 Location: Hamburg, Germany
|
Posted: Sat Jul 21, 2012 4:58 pm Post subject: Shell-Skript zum Aufräumen von LaTeX-Sourcen und Abbildungen |
|
|
Hallo,
ich bastle mir gerade ein Shell-Skript zu Aufräumen meines Home-Verzeichnis. Im Eifer des Gefechts habe ich dort viele LaTeX Dokumente mit Abbildungen erstellt. Nun möchte ich die Source-Files mit den entsprechenden Abbildungen in eigene Verzeichnisse verschieben. Dabei können die Abbildungen durchaus mehrfach in verschiedenen Abblidungen verwendet worden sein. Um zu vermeiden, dass bei evtl. Änderungen an den Abbildungen, sich diese als Seiteneffekt auch in anderen Dokumenten beim erneuten Übersetzen ändern, müssen diese also jeweils in die neuen Verzeichnisse kopiert werden, ein gemeinsames figures/-Verzeichnis geht nicht. Dass ich da die Übersicht verloren habe, welche Abbildung wo verwendet wird, ist ein wichtiger Grund für das Aufräumen.
Hier mein Skript bis jetzt:
Code: | for i in *.tex
do
NAME=`echo "$i" | cut -d '.' -f1`
echo "Erstelle Verzeichnis " $NAME
mkdir -p $NAME
rm "$NAME"/*
mv $i $NAME
cd $NAME
echo "Bearbeite " $i
pdflatex -interaction nonstopmode $i > /dev/null
grep "not found" $NAME.log > missing
cut -d \` -f 2 missing | cut -d \' -f 1 > missing2
while read line || [ "$line" != "" ]
do
echo Kopiere $line
cp ../$line* .
echo ../$line* >> ../list_of_touched_files
done < missing2
pdflatex -interaction nonstopmode $i > /dev/null
rm missing missing2 *.aux *.log
cd ..
done
LOF=`sed -e "sa../aag" -e "s/ /\n/g" list_of_touched_files | sort | uniq`
mv $LOF fig_backup/
|
Am Ende will ich natürlich die Files und die Abbildungen aus dem aktuellen Verzeichnis löschen (momentan kopiere ich die Abbildungen noch in ein Backup-Verzeichnis).
Allerdings traue ich meinen Shell-Kenntnissen nicht über den Weg, wäre also dankbar, wenn hier mal jemand einen Blick drauf wirft. Datenverlust wäre bei den Dokumenten um die es geht echt ärgerlich. |
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6747
|
Posted: Sun Jul 22, 2012 7:07 am Post subject: |
|
|
Das ganze Script habe ich mir nicht durchgelesen, aber ein paar Anmerkungen:
Code: | NAME=`echo "$i" | cut -d '.' -f1` |
Das macht man besser ohne externe Kommandos:
Für andere Kommandos sollte man das "--" nicht vergessen (um Probleme mit Filenamen zu vermeiden, die mit "-" beginnen). Variablen gehören grundsätzlich gequoted, sonst gibt es bei Leerzeichen in Namen unangenehme Überraschungen:
Code: | rm -- "$NAME"/*
mv -- "$i" "$NAME" |
Ein wichtiger Punkt der Unix-Shell-Philosophie ist es, Pipes anstelle von Temporärfiles (missing, missing2) zu benutzen
Code: | grep "not found" -- "$NAME.log" | \
cut -d \` -f 2 | cut -d \' -f 1 | \
while read line || ... |
Nachteil von PIpes ist allerdings, dass diese meist in einer Subshell ausgeführt werden, so dass es nicht möglich ist, etwa in "while" Variablen zu setzen, die anschließend benutzt werden; es ginge dann aber Code: | {
while read ...
A=...
done
Rest des Scripts das A benutzt
} | Ohnehin würde ich statt cd .. eine Subshell benutzen:
Code: | ( cd -- "${NAME}"
...
) | Der erste "pdflatex"-Aufruf scheint übrigens keinen Sinn zu ergeben, weil die Datei "$i" im gerade gelöschten Verzeichnis sicher nicht existiert.
Du hast auch viele kritische Kommandos, bei deren Fehlschlag Du besser abbrechen solltest (stelle Dir nur vor, Dein Kommando zur Zuweisung von NAME schlägt fehl, und dann ist NAME leer; Dein rm -- "${NAME}"/* ist dann mehr als kritisch): Du solltest entweder den Fehlerstatus nach diesen Kommandos abfragen und im Fehlerfall abbrechen, etwa Code: | Fatal() {
echo "${1:-Fehler}"
exit 1
}
cp ... || Fatal
mv .. || Fatal "Fehler bei mv" |
(Vorsicht: Das "exit" beendet nur die jeweilige Subshell!) oder generell mit set -e arbeiten und "erlaubte" Fehler abfragen: Code: | set -e
cp ... # Abbruch im Fehlerfall
mv ... || : # Kein Abbruch im Fehlerfall |
Und noch etwas: Hat es einen Grund mit "cp" statt mit "ln" zu arbeiten? |
|
Back to top |
|
|
furanku l33t
Joined: 08 May 2003 Posts: 905 Location: Hamburg, Germany
|
Posted: Sun Jul 22, 2012 7:50 am Post subject: |
|
|
Wow! Danke, das sind ja schon mal viele Tipps! Bin heute mit Aufräumen und Renovieren in der realen Welt beschäftigt. Melde mich zurück, sobald ich die Verbesserungen umgesetzt habe. Und ja, Du wirst es gemerkt haben: Das ist mein erstes Skript, das länger als zwei Zeilen ist. Vielen Dank noch mal! |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|