Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Shell-Skript zum Aufräumen von LaTeX-Sourcen und Abbildungen
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
furanku
l33t
l33t


Joined: 08 May 2003
Posts: 905
Location: Hamburg, Germany

PostPosted: Sat Jul 21, 2012 4:58 pm    Post subject: Shell-Skript zum Aufräumen von LaTeX-Sourcen und Abbildungen Reply with quote

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
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6747

PostPosted: Sun Jul 22, 2012 7:07 am    Post subject: Reply with quote

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:
Code:
NAME=${i%.*}

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
View user's profile Send private message
furanku
l33t
l33t


Joined: 08 May 2003
Posts: 905
Location: Hamburg, Germany

PostPosted: Sun Jul 22, 2012 7:50 am    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
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