find, xargs - bestes Vorgehen?

03/09/2008 - 23:19 von Jan Luehr | Report spam
Hallo,

mein Problem klingt eigentlich sehr simpel:
Ich möchte gerne Listen mit Dateien aus einem Find-Ergebnis erstellen. Die
Form sollte
mTime(als Epoch):Dateiname sein (anderes Trennzeichen möglich)
Naiv formuliert:
find DIR COND -print "%T@:%p" > liste.csv
Die Listen werden dann untereinander abgeglichen (welche Datei existiert wo)
und dann ggf. als Parameter für einen rm-Aufruf benutzt.
Da Dateinamen aber "böse" sein können, ist es üblich so etwas über xargs zu
erledogen - hier fehlt mir aber gerade der Ansatz:
Wie schaffe ich es am besten, den Dateinamen in einer csv-Datei abzulegen
und dann mit xargs zu benutzen?

Danke,
Keep smiling
yanosz
 

Lesen sie die antworten

#1 Helmut Waitzmann
04/09/2008 - 00:46 | Warnen spam
Jan Luehr writes:

Hallo,

mein Problem klingt eigentlich sehr simpel:
Ich möchte gerne Listen mit Dateien aus einem Find-Ergebnis erstellen. Die
Form sollte
mTime(als Epoch):Dateiname sein (anderes Trennzeichen möglich)
Naiv formuliert:
find DIR COND -print "%T@:%p" > liste.csv
Die Listen werden dann untereinander abgeglichen (welche Datei existiert wo)
und dann ggf. als Parameter für einen rm-Aufruf benutzt.
Da Dateinamen aber "böse" sein können, ist es üblich so etwas über xargs zu
erledogen - hier fehlt mir aber gerade der Ansatz:
Wie schaffe ich es am besten, den Dateinamen in einer csv-Datei abzulegen
und dann mit xargs zu benutzen?



Da Dateinamen "böse" sein können, ist es nicht möglich, sie in
csv-Dateien abzulegen.

Was bleiben für Alternativen?

* Kodiere die Dateinamen so, dass nichts "Böses" mehr übrig bleibt; dann
kannst du sie in csv-Dateien stecken.

Vorteil: Anschließend ist die Liste sehr gut mit Text-bearbeitenden
Programmen wie "diff", "sort", "uniq" oder "sed" zu bearbeiten.

Nachteil: Um die Dateinamen zu verwenden, d.h. Dateien mit ihnen
anzufassen, muss man sie wieder entsprechend dekodieren.

Leider gibt es nichts Fertiges dafür.

Oder

* verwende ein anderes Dateiformat als csv.

Wenn du die GNU-Fassungen von "find" und "xargs" zur Verfügung hast, dann
kannst du dir so helfen:

$ find DIR COND -printf '%T@\000%p\000' > liste.nul

(Übrigens: Hinter das "-print" muss ein "f".)

Mit "xargs" benutzen kannst Du dann die Liste etwa so:

$ xargs -0 -r -- sh -c \
'while test "$#" -ge 2
do
Zeit="$1" && Name="$2" && shift 2 && ...
done' sh < liste.nul

oder, falls man lieber direkt ein Programm für jede Datei aufrufen will,
anstatt im Shell eine Schleife über die positional Parameters
abzuarbeiten:

$ xargs -0 -r -n 2 -- ... < liste.nul

Die GNU-Fassung von "sort" kann mit NUL als Feld-Trennzeichen und als
Zeilenende umgehen (Options "-t" bzw. "--zero-terminated"). "grep" kennt
"--null" und "--null-data". Bei "diff" und "uniq" gibt es leider nichts
dieser Art.
Wer mir E-Mail schreiben will, stelle | When writing me e-mail, please
bitte vor meine E-Mail-Adresse meinen | precede my e-mail address with
Vor- und Nachnamen, etwa so: | my full name, like
Helmut Waitzmann , (Helmut Waitzmann)

Ähnliche fragen