Am Freitag, 12. September 2008 14:37:49 schrieb Dr. Jürgen Vollmer:
Am Freitag, 12. September 2008 14:37:49 schrieb Dr. Jürgen Vollmer:
Am Freitag, 12. September 2008 14:15:19 schrieb Steffen Hanne:
Hallo liebe Scriptfreunde,
ich hatte ja geschrieben, dass das Script welches ich fand mein Problem mit der Sortierung von Daten löst. Allerdings funktioniert das Script nicht, wenn Leerzeichen im Dateinamen/Verzeichnisnamen enthalten sind. Vielleicht kann mir jemand helfen.
schnipp>>>>>>>
#! /bin/sh # Usage: # findalpha [-R]
# Reorder the directory entries according to alphanumerical order, so # find output is in order. Useful for preparing files for play on an # MP3 player that follows directory order. # If -R is given, do recursively.
# Thu Dec 27 02:47:00 EST 2007 v. 0.1 jh initial version
# TODO: # handle spaces in file/directory names # figure out why it works on IDE but not on USB, even if the FS is ext3
if [ "$1" = "-R" ] ; then dirs=`find . -type d` else dirs=. fi for dir in $dirs; do cd "$dir" tmp=`mktemp -d -p .` mv `find . -maxdepth 1 -mindepth 1 | grep -v $tmp` $tmp cd $tmp mv `find . -maxdepth 1 -mindepth 1 | sort -n` .. cd .. rmdir $tmp cd "$start" done
das kann nicht funktionieren, - dirs=`find . -type d` enthält eine Liste von Wörtern, wenn da in den Verzeichnisnamen Blanks enthalten sind, dann ist das in $dirs nicht mehr zu erkennen. - mv `find ....` auch find liefert eine Liste von Dateinamen, die blanks enthalten können. mv betrachtet dies dann als separate Dateien.....
besser:
tmp=`mktemp -d -p /tmp`
find . -type d | \ while read d do
das
find $d -type f | \
muss natürlich find "$d" -type f | \ heissen
while read f do mv "$f" $tmp done find $tmp -type f | sort -n \ while read f do
das
mv "$f" $d
muß natürlich mv "$f" "$d" heissen
done done (ungetestet :-)
(ausversehen zu schnell den Send-Knopf gedrückt :-)
Bye ürgen
Hallo Jürgen, nach deiner Anregung (danke dafür) sieht das Script jetzt so aus: #! /bin/sh # Usage: # findbeta # Reorder the directory entries according to alphanumerical order, so # find output is in order. Useful for preparing files for play on an # MP3 player that follows directory order. # Thu Dec 27 02:47:00 EST 2007 v. 0.1 jh initial version tmp=`mktemp -d -p /tmp` find . -type d | \ while read d do find "$d" -type f | \ while read f do mv "$f" $tmp done find $tmp -type f | sort -n \ while read f do <-hier ist der Fehler mv "$f" "$d" done done Allerdings bekomme ich einen Syntaxfehler (unexpected token) in Zeile 23. Kann jemand helfen? -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Fri, 12 Sep 2008, 18:25:21 +0200, Steffen Hanne wrote:
[...]
Am Freitag, 12. September 2008 14:37:49 schrieb Dr. Jürgen Vollmer:
Am Freitag, 12. September 2008 14:15:19 schrieb Steffen Hanne:
Hallo liebe Scriptfreunde,
ich hatte ja geschrieben, dass das Script welches ich fand mein Problem mit der Sortierung von Daten löst. Allerdings funktioniert das Script nicht, wenn Leerzeichen im Dateinamen/Verzeichnisnamen enthalten sind. Vielleicht kann mir jemand helfen.
schnipp>>>>>>>
#! /bin/sh # Usage: # findalpha [-R]
# Reorder the directory entries according to alphanumerical order, so # find output is in order. Useful for preparing files for play on an # MP3 player that follows directory order. # If -R is given, do recursively.
# Thu Dec 27 02:47:00 EST 2007 v. 0.1 jh initial version
# TODO: # handle spaces in file/directory names # figure out why it works on IDE but not on USB, even if the FS is ext3
if [ "$1" = "-R" ] ; then dirs=`find . -type d` else dirs=. fi for dir in $dirs; do cd "$dir" tmp=`mktemp -d -p .` mv `find . -maxdepth 1 -mindepth 1 | grep -v $tmp` $tmp cd $tmp mv `find . -maxdepth 1 -mindepth 1 | sort -n` .. cd .. rmdir $tmp cd "$start" done
das kann nicht funktionieren, - dirs=`find . -type d` enthält eine Liste von Wörtern, wenn da in den Verzeichnisnamen Blanks enthalten sind, dann ist das in $dirs nicht mehr zu erkennen. - mv `find ....` auch find liefert eine Liste von Dateinamen, die blanks enthalten können. mv betrachtet dies dann als separate Dateien.....
besser:
tmp=`mktemp -d -p /tmp`
find . -type d | \ while read d do
das
find $d -type f | \
muss natürlich find "$d" -type f | \ heissen
while read f do mv "$f" $tmp done find $tmp -type f | sort -n \ while read f do
das
mv "$f" $d
muß natürlich mv "$f" "$d" heissen
done done (ungetestet :-)
(ausversehen zu schnell den Send-Knopf gedrückt :-)
Bye ürgen
Hallo Jürgen,
nach deiner Anregung (danke dafür) sieht das Script jetzt so aus:
#! /bin/sh
# Usage: # findbeta
# Reorder the directory entries according to alphanumerical order, so # find output is in order. Useful for preparing files for play on an # MP3 player that follows directory order.
# Thu Dec 27 02:47:00 EST 2007 v. 0.1 jh initial version
tmp=`mktemp -d -p /tmp` find . -type d | \ while read d do find "$d" -type f | \ while read f do mv "$f" $tmp done find $tmp -type f | sort -n \
In der vorangehenden Zeile fehlt ein Pipe-Zeichen, also: find $tmp -type f | sort -n | \
while read f do <-hier ist der Fehler mv "$f" "$d" done done
Allerdings bekomme ich einen Syntaxfehler (unexpected token) in Zeile 23.
Kann jemand helfen?
HTH, cheers. l8er manfred PS: Wenn du das noch etwas einrueckst, wird das Script auch etwas uebersichtlicher ;-) Also vielleicht so: #! /bin/sh # Usage: # findbeta # Reorder the directory entries according to alphanumerical order, so # find output is in order. Useful for preparing files for play on an # MP3 player that follows directory order. # Thu Dec 27 02:47:00 EST 2007 v. 0.1 jh initial version tmp=`mktemp -d -p /tmp` find . -type d | \ while read d do find "$d" -type f | \ while read f do mv "$f" $tmp done find $tmp -type f | sort -n | \ while read f do mv "$f" "$d" done done -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Steffen! On Fri, 12 Sep 2008, Steffen Hanne wrote:
#! /bin/sh
# Usage: # findbeta
# Reorder the directory entries according to alphanumerical order, so # find output is in order. Useful for preparing files for play on an # MP3 player that follows directory order.
# Thu Dec 27 02:47:00 EST 2007 v. 0.1 jh initial version
tmp=`mktemp -d -p /tmp` find . -type d | \ while read d do find "$d" -type f | \ while read f do mv "$f" $tmp done find $tmp -type f | sort -n \ while read f do <-hier ist der Fehler mv "$f" "$d" done done
Allerdings bekomme ich einen Syntaxfehler (unexpected token) in Zeile 23.
Da fehlt ein '|' in der Zeile vorher. Beim flüchtigen drüber schauen ist mir außerdem aufgefallen, dass Dein read Backslashes¹ schluckt. Besser read mit der Optione -r aufrufen (oder gleich find das umbenennen überlassen [ find ... -exec mv -t "$d" '{}' + ] __ ¹) Am robustesten ist afaik immer noch die Kombination find -print0 | while IFS= read -r -d $'\0' name ; do .... done Das sollte mit allen Ekligkeiten, die in Dateinamen vorkommen können umgehen können. Mit freundlichen Grüßen Christian -- You can be stopped by the police for biking over 65 miles per hour. You are not allowed to walk across a street on your hands. [real standing laws in Connecticut, United States of America] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Fri 12 Sep 2008, Christian Brabandt wrote:
IFS= read -r -d $'\0'
Ist diese Syntax -d $'\0' auch irgendwo beschrieben? Ich habe schon oft danach gesucht, wie man read die -0 Option anderer Programme beibringen kann, Danke! Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Torsten! On Fri, 12 Sep 2008, Torsten Foertsch wrote:
On Fri 12 Sep 2008, Christian Brabandt wrote:
IFS= read -r -d $'\0'
Ist diese Syntax -d $'\0' auch irgendwo beschrieben? Ich habe schon oft danach gesucht, wie man read die -0 Option anderer Programme beibringen kann, Danke!
Das ist bash-spezifisch. In anderen Shells mag das anders aussehen. man bash |less -p "^QUOTING" und dann ungefähr 1 Seite scrollen. Mit freundlichen Grüßen Christian -- Florida: A special law prohibits unmarried women from parachuting on Sunday or she shall risk arrest, fine, and/or jailing. [real standing law in Florida, United States of America] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Freitag, 12. September 2008 schrieb Christian Brabandt:
Da fehlt ein '|' in der Zeile vorher. Beim flüchtigen drüber schauen ist mir außerdem aufgefallen, dass Dein read Backslashes¹ schluckt. Besser read mit der Optione -r aufrufen (oder gleich find das umbenennen überlassen [ find ... -exec mv -t "$d" '{}' + ] Danke Christian,
damit läuft das Script vom Jürgen, allerdings wirft es (wenn gestartet in übergeordneten Verzeichnis) die Dateien der Unterverzeichnisse CD 01 und CD 02 in das übergeordnete Verzeichnis.
__ ¹) Am robustesten ist afaik immer noch die Kombination find -print0 | while IFS= read -r -d $'\0' name ; do .... done Das sollte mit allen Ekligkeiten, die in Dateinamen vorkommen können umgehen können.
Das müsstest Du mir bitte in das Script einbauen, soweit reicht mein Verständnis leider noch nicht... <shame>
Mit freundlichen Grüßen Christian --
Grüße zurück Steffen -- Letzte Worte eines Fallschirmspringers: "Welcher Notfallschirm?" -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Steffen! On Fri, 12 Sep 2008, Steffen Hanne wrote:
Am Freitag, 12. September 2008 schrieb Christian Brabandt:
__ ¹) Am robustesten ist afaik immer noch die Kombination find -print0 | while IFS= read -r -d $'\0' name ; do .... done Das sollte mit allen Ekligkeiten, die in Dateinamen vorkommen können umgehen können. Das müsstest Du mir bitte in das Script einbauen, soweit reicht mein Verständnis leider noch nicht... <shame>
Du hast doch jetzt fatsort gefunden. Dann brauchst Du doch das Script nicht mehr? Mit freundlichen Grüßen Christian -- If an elephant is left tied to a parking meter, the parking fee has to be paid just as it would for a vehicle. [real standing law in Florida, United States of America] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Fri 12 Sep 2008, Steffen Hanne wrote:
tmp=`mktemp -d -p /tmp` find . -type d | \
Der Backslash am Ende ist unnötig. In den ähnlichen Zeilen unten auch.
while read d do find "$d" -type f | \ while read f do mv "$f" $tmp done find $tmp -type f | sort -n \
Das ist einfach. In voriger Zeile hast Du das Pipe-Symbol am Ende vergessen.
while read f do <-hier ist der Fehler mv "$f" "$d" done done
Das Ding ist trotzdem noch unsicher. Ein Dateiname darf nämlich durchaus ein Newline enthalten, nicht nur Spaces. Das würde Dein Script nochmal durcheinander bringen, weil read zeilenweise liest. Ich würde find mit -print0 und xargs mit -0i einsetzen. Außerdem denke ich, in dem Script kam die Logik etwas durcheinander. Du suchst in . rekursiv Unterverzeichnisse (1. find-Befehl). Dann nimmst Du jedes Unterverzeichnis (wobei . nochmal auftaucht), suchst darin Dateien, um sie nach $tmp zu verschieben (find Nummer 2). Wenn Du nun alle Dateien eines Unterverzeichnisses nach $tmp verschoben hast, suchst Du nochmal in $tmp nach Dateien und verschiebst diese nach $d (3. find). Gut, ich habe es begriffen, Du willst das Zeug in $tmp haben, damit Du nach Dateinamen sortieren kannst. Kommst Du nicht mit folgendem zum selben Resultat? find . -type f -print0 | perl -n0e '$base=$_; $base=~s!.*/!!; $names{$base}=$_; END {print map $names{$_}, sort keys %names}' | xargs -0i^ mv ^ "$d"/ Das ist alles in eine Zeile geschrieben. Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Freitag, 12. September 2008 schrieb Torsten Foertsch:
Gut, ich habe es begriffen, Du willst das Zeug in $tmp haben, damit Du nach Dateinamen sortieren kannst. Kommst Du nicht mit folgendem zum selben Resultat?
find . -type f -print0 | perl -n0e '$base=$_; $base=~s!.*/!!; $names{$base}=$_; END {print map $names{$_}, sort keys %names}' | xargs -0i^ mv ^ "$d"/
Das ist alles in eine Zeile geschrieben.
Torsten
--
Meintest du so? tmp=`mktemp -d -p /tmp` find . -type d | \ while read d do find . -type f -print0 | perl -n0e '$base=$_; $base=~s!.*/!!; $names{$base}=$_; END {print map $names{$_}, sort keys %names}' | xargs -0i^ mv ^ "$d"/ done Damit hat er mir die Dateien aus Unterverzeichnis CD 02 in Unterverzeichnis CD 01 verschoben. Ich glaub meine Logik ist jetzt auch durcheinander.... Steffen -- Ich habe Fehler begangen, doch ich beging nie den Fehler zu behaupten, ich hätte keine begangen. -- James Gordon Bennett -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Fri 12 Sep 2008, Steffen Hanne wrote:
Meintest du so?
tmp=`mktemp -d -p /tmp` find . -type d | \ while read d do find . -type f -print0 | perl -n0e '$base=$_; $base=~s!.*/!!; $names{$base}=$_; END {print map $names{$_}, sort keys %names}' | xargs -0i^ mv ^ "$d"/ done
nein, diese eine Zeile war Dein ganzes Script. $tmp brauchst Du nciht mehr. Also 1x find, um die Dateien zu finden. Perl zum Sortieren und dann xargs zum verschieben. Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Fre, 12 Sep 2008, Steffen Hanne schrieb: Erstmal: du darfst Befehle einrücken, das erhöht die Lesbarkeit!
tmp=`mktemp -d -p /tmp`
Wenn man /tmp/ nimmt müssen die Dateien ggfs. auf ne andere Partition geschoben werden, das ist nicht sinnvoll.
find . -type d | \ while read d do find "$d" -type f | \ while read f do mv "$f" $tmp done find $tmp -type f | sort -n \ while read f
Zwischen sort und while fe lt was.
do <-hier ist der Fehler mv "$f" "$d" done done
Ausserdem sollte touch reichen. -- Ein Mann, ein Wort. Eine Frau, ein Wrterbuch. -- Michael Wagner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (5)
-
Christian Brabandt
-
David Haller
-
Manfred Hollstein
-
Steffen Hanne
-
Torsten Foertsch