Damit hab ich derzeit folgende Probleme:
- trotz dem -v Schalter bekomme ich keine Ausgabe.
- Gelegentlich läuft sich der Mist tot und muss von Hand via Ctrl+C gestoppt werden. Insbesondere wenn während des Kopiervorgangs Dateien hinzukommen od. wenn der Zielordner nicht vorhanden ist.
Ich fürchte, das kann man nicht ganz so einfach reparieren. Mit Anführungszeichen kann man die Shell davon abhalten, Dateinamen mit Leerzeichen aufzuteilen, aber dann scheitert es trotzdem an Künstlern mit Leerzeichen bzw. Dateien ohne Künstler.
$ ls -1
aaah.doc
'foo - bar.mp3'
'kein künstler.xlsx'
'test fighters - bla bla.mp3'
'test fighters - blub.mp3'
$ for i in $(ls | awk -F ' - ' '{print $1}'); do echo cp -v "$i"* "/zielverzeichnis/$i" ; done
cp -v aaah.doc /zielverzeichnis/aaah.doc
cp -v foo - bar.mp3 /zielverzeichnis/foo
cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test
cp -v fighters* /zielverzeichnis/fighters
cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test
cp -v fighters* /zielverzeichnis/fighters
Alles anzeigen
Man kann es etwas verbessern, wenn man der Shell mitteilt, dass nur Zeilenende als Worttrenner zu nutzen ist. Trotzdem wird bei einem Künstler mit X Dateien jede X-mal kopiert.
$ IFS=$'\n'; for i in $(ls | awk -F ' - ' '{print $1}'); do echo cp -v "$i"* "/zielverzeichnis/$i" ; done; IFS=$' \t\n'
cp -v aaah.doc /zielverzeichnis/aaah.doc
cp -v foo - bar.mp3 /zielverzeichnis/foo
cp -v kein künstler.xlsx /zielverzeichnis/kein künstler.xlsx
cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test fighters
cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test fighters
Wenn man schon awk nutzt, kann man damit natürlich ein kleines Programm schreiben, hier zur Verdeutlichung über mehrere Zeilen (wie in Shell- oder Javascript-Syntax beendet entweder ein Semikolon oder eine neue Zeile einen Befehl). Die erzeugten Shell-Befehle werden tatsächlich ausgeführt, wenn man die gesamte Befehlszeile in eval $( ... ) steckt.
$ find -maxdepth 1 -type f -printf "%f\n" | \
awk -v "destdir=/zielverzeichnis" -F ' - ' '{
filename=$0
if (NF > 1) { subdir="/" $1 }
else { subdir="" }
target=destdir subdir "/"
print "cp -v \"" filename "\" \"" target "\"" }'
cp -v "test fighters - bla bla.mp3" "/zielverzeichnis/test fighters/"
cp -v "kein künstler.xlsx" "/zielverzeichnis/"
cp -v "test fighters - blub.mp3" "/zielverzeichnis/test fighters/"
cp -v "aaah.doc" "/zielverzeichnis/"
cp -v "foo - bar.mp3" "/zielverzeichnis/foo/"
Alles anzeigen
Das könnte man nun noch weiter ausbauen, etwa durch ein zusätzliches
oder indem man install statt cp missbraucht.