Stellen Sie sich ein Verzeichnis mit typischen Microsoft Windows-Dateinamen vor:
Neues Dokument.txt Foo.doc Foo - Kopie.doc
Ich möchte mit jeder Datei etwas machen, zum Beispiel:
für Sendedatei in $(find ${POLLDIR} -type f -mmin +1 -print0) Tun echo \"${sendfile}\" ls -l "${sendfile}" und so weiter wenn Erfolg_oben Dann mv "${sendfile}" "${donedir}/." fi Erledigt
Bitte beachten Sie, dass ich nicht nur einen Befehl mit "${sendfile}" als Argument ausführen möchte. Ich benötige die Schleife, um Fehlerprüfungen und andere Dinge durchzuführen (wie das Verschieben von "${sendfile}" bei Erfolg und das Protokollieren bei Fehlern).
Was ist eine „richtige“ Konstruktion, um die Dateinamen aus „find“ zu maskieren/in Anführungszeichen zu setzen, damit ich sie in einem „for“-Look wie im ls
obigen Befehl verwenden kann? Wenn möglich, möchte ich vermeiden, die Dateinamen einzeln in einer temporären Datei zu speichern.
Ich glaube nicht, dass, find -printf '"%p"\n'
wie von triplee in den Kommentaren zur Frage vorgeschlagen, [Wie verwende ich die Suche, wenn der Dateiname Leerzeichen enthält?] in einem Konstrukt funktionieren würde for foo in $(...) do
.
Ich denke, das Ersetzen „unzulässiger“ Zeichen durch ?
würde in diesem Fall für mich funktionieren, aber es wäre sehr hässlich. Die For-Schleife verarbeitet letztendlich Dateien in ${POLLDIR} und verschiebt sie dann, wenn sie fertig sind, sodass die Wahrscheinlichkeit, dass „Foo bar.txt“ mit „Foo-bar.txt“ kollidiert, 0 (-ish) ist.
Mein bisher bester Versuch ist:
für Sendedatei in $(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?') Tun ... Erledigt
Irgendwelche Vorschläge für Reiniger?
Antwort1
find ... -print0 | while IFS="" read -d ""
Konstrukt verwenden :
find "${POLLDIR}" -type f -mmin +1 -print0 | while IFS="" read -r -d "" sendfile
do
echo "${sendfile}"
ls -l "${sendfile}"
and-so-on
if success_above
then
mv "${sendfile}" "${donedir}/."
fi
done
Das -d ""
setzt das Zeilenendezeichen auf null ( \0
), was die einzelnen gefundenen Dateinamen trennt, find ... -print0
und das IFS=""
ist erforderlich, um auch mit Dateinamen arbeiten zu können, die Zeilenumbrüche enthalten - laut POSIX sind nur Schrägstriche ( /
) und null ( \0
) verboten. Das -r
stellt sicher, dass Backslashs keine Escape-Zeichen darstellen (so dass das \t
beispielsweise einem tatsächlichen Backslash gefolgt von einem t
und nicht einem Tabulator entspricht).