Dateilisten mittels find und xargs?
Dateilisten mittels find und xargs?
Hallo,
ich habe ein Problem mit der Erstellung von Dateilisten.
ein:
cd /home/sonya/test/dateiliste
dort:
find . -name "*.tiff" -print0 | xargs -0 ls >liste.txt
erstellt im Ordner
cd /home/sonya/test/dateiliste
eine "liste.txt" mit dem Inhalt der Verzeichnisstruktur und den jeweils darin befindlichen tiff Dateien.
Die "liste.txt" soll jedoch in den jeweiligen Sub- und Subsubverzeichnissen mit den jeweiligen darin befindlichen Dateien hineingeschrieben werden.
Also nicht eineDatei "liste.txt" in Hauptverzeichnis sondern in jeden einzelnen Subvereichnis innerhalb der gesamten Verzeichnistiefe eine "liste.txt" mit einer Liste der jeweiligen Dateien die im jeweiligen Subverzeichnis liegen.
Das heist ja, xarg müsste die Verzeichnisstruktur übergeben bekommen und dann in jedes Subverzeichnis hinein kriechen und dort das jeweilige "ls >liste.txt" ausführen.
Nur wie kann das gelöst werden? Kann das Problem überhaupt mittels xargs gelöst werden oder muss da schwere Perlprogrammierung aufgefahren werden?
LG
Sonya
ich habe ein Problem mit der Erstellung von Dateilisten.
ein:
cd /home/sonya/test/dateiliste
dort:
find . -name "*.tiff" -print0 | xargs -0 ls >liste.txt
erstellt im Ordner
cd /home/sonya/test/dateiliste
eine "liste.txt" mit dem Inhalt der Verzeichnisstruktur und den jeweils darin befindlichen tiff Dateien.
Die "liste.txt" soll jedoch in den jeweiligen Sub- und Subsubverzeichnissen mit den jeweiligen darin befindlichen Dateien hineingeschrieben werden.
Also nicht eineDatei "liste.txt" in Hauptverzeichnis sondern in jeden einzelnen Subvereichnis innerhalb der gesamten Verzeichnistiefe eine "liste.txt" mit einer Liste der jeweiligen Dateien die im jeweiligen Subverzeichnis liegen.
Das heist ja, xarg müsste die Verzeichnisstruktur übergeben bekommen und dann in jedes Subverzeichnis hinein kriechen und dort das jeweilige "ls >liste.txt" ausführen.
Nur wie kann das gelöst werden? Kann das Problem überhaupt mittels xargs gelöst werden oder muss da schwere Perlprogrammierung aufgefahren werden?
LG
Sonya
Re: Dateilisten mittels find und xargs?
Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | awk '{ system("basename "$1" >> `dirname "$1"`/liste.txt") }'
Use ed once in a while!
Re: Dateilisten mittels find und xargs?
Hallo Meillo,Meillo hat geschrieben:Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | awk '{ system("basename "$1" >> `dirname "$1"`/liste.txt") }'
das ist ja erstaunlich! Ein Einzeiler kann so etwas
AWK ist ja auch sehr mächtig. Habe mich damit überhaupt noch nicht auseinander gesetzt
Nur wie bekomme ich die Zeilen (Dateinamen) in "liste.txt" alphabetisch sortiert? Viele Dateien haben Namen der Art 01-xyz.tiff bis 09-xyz.tiff und weiter mit 10..., 11... Dachte das funktioniert automatisch nach Dateinamen.
Muss ich da zum Sortieren noch einmal sed bei allen "liste.txt" durchlaufen lassen.
In der Tiefe der Verzeichnisse gibt es Dateien und Verzeichnisse mit Leerzeichen und Zeichen die nicht A-z, a-z und 0-9. Mit denen funktioniert Dein Beispiel nicht. Wird im Ablauf des Skripts solch ein Verzeichnis gefunden, wird eine Fehlermeldung ausgegeben. Ebenso bei entsprechenden Dateien.
Das ist jedoch nicht tragisch. Aus den Verzeichnissen und Dateien müssen alle Zeichen zu entfernt bzw. umbenannt werden, die nicht A-z, a-z und 0-9 entsprechen und Leerzeichen werden durch "_" ersetzt. Da bin ich gerade dabei. pyrename bzw. krename sind da eine gute Hilfe.
LG
Sonya
Re: Dateilisten mittels find und xargs?
Noch ein sort zwischen find und awk:
Die Sortierung kannst Du bezüglich Leer- und Sonderzeichen beeinflussen, ich verwende
Code: Alles auswählen
... | sort -n | ...[/b]
Code: Alles auswählen
export LC_COLLATE=POSIX
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: Dateilisten mittels find und xargs?
find . -type d -execdir sh -c 'find $1 -mindepth 1 -maxdepth 1 >$1/liste' find-sh '{}' \;
Grüße,
Christian
Grüße,
Christian
Meine Whishlist
:wq!
:wq!
Re: Dateilisten mittels find und xargs?
Hallo Meillo, rendegast und Christian,
vielen Dank für Eure Hife. Die Sache funktioniert jetzt.
Ich schaffe es einfach nicht, ganz hinten den Verzeichnisnahmen in denen sich die Dateien befinden also verzeichnis.txt" anstelle "liste.txt" einzusetzen.
bringt erwartungsgemäß einen Fehler.
bringt einen Fehler, ebenso wie:
Es kann doch nicht soo schwer sein, nicht "liste.txt" sondern den "jeweiligerVerzeichnisnahme-liste.txt" auszugeben
LG
Sonya
vielen Dank für Eure Hife. Die Sache funktioniert jetzt.
Was ich nicht "ganz" verstehe ist, ja fast alles hinter awkMeillo hat geschrieben:Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | awk '{ system("basename "$1" >> `dirname "$1"`/liste.txt") }'
Ich schaffe es einfach nicht, ganz hinten den Verzeichnisnahmen in denen sich die Dateien befinden also verzeichnis.txt" anstelle "liste.txt" einzusetzen.
Code: Alles auswählen
... ...`dirname "$1"`/"$1"-liste.txt") }'
Code: Alles auswählen
... ...`dirname "$1"`/`dirname "$1"`-liste.txt") }'
Code: Alles auswählen
... ...`dirname "$1"`/'$1'-liste.txt") }'
LG
Sonya
Re: Dateilisten mittels find und xargs?
Du meinst vermutlich bei ``foo/bar/baz/a.tiff'' soll es ``baz.txt'' sein.sonya hat geschrieben:Ich schaffe es einfach nicht, ganz hinten den Verzeichnisnahmen in denen sich die Dateien befinden also verzeichnis.txt" anstelle "liste.txt" einzusetzen.Meillo hat geschrieben:Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | awk '{ system("basename "$1" >> `dirname "$1"`/liste.txt") }'
In $1 wird oft ein Slash enthalten sein. Der darf in Dateinamen aber nicht vorkommen. Nicht-existente Unterverzeichnisse werden aber nicht angelegt.bringt erwartungsgemäß einen Fehler.Code: Alles auswählen
... ...`dirname "$1"`/"$1"-liste.txt") }'
Du wirst `basename \`dirname $1\` ` verwenden müssen.
Code: Alles auswählen
... ...`dirname "$1"`/`basename \`dirname "$1"\` `-liste.txt") }'
Use ed once in a while!
Re: Dateilisten mittels find und xargs?
Hallo Meillo,
vielen Dank für deine Bemühungen
Doch egal wie ich Deinen Vorschlag anwende, Diese Zeichen " ` " durch " ' " getauscht, auch den Slash per Backslash "auskommentiert", Deine Variante mag noch nicht richtig funktionieren?
LG Sonya
vielen Dank für deine Bemühungen
Ja, genau so.Meillo hat geschrieben:Du meinst vermutlich bei ``foo/bar/baz/a.tiff'' soll es ``baz.txt'' sein.sonya hat geschrieben:Ich schaffe es einfach nicht, ganz hinten den Verzeichnisnahmen in denen sich die Dateien befinden also verzeichnis.txt" anstelle "liste.txt" einzusetzen.Meillo hat geschrieben:Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | awk '{ system("basename "$1" >> `dirname "$1"`/liste.txt") }'
Das mit dem Slash habe ich nicht gewusstMeillo hat geschrieben:In $1 wird oft ein Slash enthalten sein. Der darf in Dateinamen aber nicht vorkommen. Nicht-existente Unterverzeichnisse werden aber nicht angelegt.sonya hat geschrieben:bringt erwartungsgemäß einen Fehler.Code: Alles auswählen
... ...`dirname "$1"`/"$1"-liste.txt") }'
Du wirst `basename \`dirname $1\` ` verwenden müssen.Code: Alles auswählen
... ...`dirname "$1"`/`basename \`dirname "$1"\` `-liste.txt") }'
Doch egal wie ich Deinen Vorschlag anwende, Diese Zeichen " ` " durch " ' " getauscht, auch den Slash per Backslash "auskommentiert", Deine Variante mag noch nicht richtig funktionieren?
LG Sonya
Re: Dateilisten mittels find und xargs?
Hier nun die schöne Version:Meillo hat geschrieben:Heute Nachmittag werde ich vermutlich wieder mehr Zeit haben. Dann kann ich's dir nochmal schön in awk machen, ohne soviele Shellbefehle und Verschachtungen.
Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | sort | awk -F/ '{
OFS=FS;
f=$NF; NF--;
list=$0"/"$NF"-liste.txt";
print f >>list;
close(list); # because number of open file descriptors is limited
}'
Fieldseparator und Output Fieldseparator werden auf `/' gesetzt. Das letzte Feld ist somit der Basename. Die Anzahl der Felder wird reduziert, damit fällt bleibt nur noch der Dirname übrig.
list beinhaltet den Namen der Datei in die die Liste gespeichert werden soll. $0 ist der Dirname. $NF ist das letzte Glied in $0.
Dann wird der Eintrag geschrieben und danach die Datei geschlossen (um nicht an's File-Deskriptor-Limit zu stoßen).
Use ed once in a while!
Re: Dateilisten mittels find und xargs?
Ich werf nochmal meine Lösung ein:sonya hat geschrieben: Es kann doch nicht soo schwer sein, nicht "liste.txt" sondern den "jeweiligerVerzeichnisnahme-liste.txt" auszugeben
find . -type d -execdir sh -c 'find "$1" -mindepth 1 -maxdepth 1 >"$1"/"${1##*/}"-liste' find-sh '{}' \;
Meine Whishlist
:wq!
:wq!
Re: Dateilisten mittels find und xargs?
Hallo Meillo,
perfekt! Das ist ja genial! DANKE!
Und auch noch mit der Erklärung. Ehrlich, ohne Erklärung wäre es schwer zu durchschauen.
Heute Abend ein Glas Rotwein auf Dein Wohl.
Vielen Dank für die Hilfe
Sonya
perfekt! Das ist ja genial! DANKE!
Und auch noch mit der Erklärung. Ehrlich, ohne Erklärung wäre es schwer zu durchschauen.
Heute Abend ein Glas Rotwein auf Dein Wohl.
Vielen Dank für die Hilfe
Sonya
Meillo hat geschrieben:Hier nun die schöne Version:Meillo hat geschrieben:Heute Nachmittag werde ich vermutlich wieder mehr Zeit haben. Dann kann ich's dir nochmal schön in awk machen, ohne soviele Shellbefehle und Verschachtungen.Erklärung des Codes:Code: Alles auswählen
find /home/sonya/test/dateiliste -name "*.tiff" | sort | awk -F/ '{ OFS=FS; f=$NF; NF--; list=$0"/"$NF"-liste.txt"; print f >>list; close(list); # because number of open file descriptors is limited }'
Fieldseparator und Output Fieldseparator werden auf `/' gesetzt. Das letzte Feld ist somit der Basename. Die Anzahl der Felder wird reduziert, damit fällt bleibt nur noch der Dirname übrig.
list beinhaltet den Namen der Datei in die die Liste gespeichert werden soll. $0 ist der Dirname. $NF ist das letzte Glied in $0.
Dann wird der Eintrag geschrieben und danach die Datei geschlossen (um nicht an's File-Deskriptor-Limit zu stoßen).