Shell-For-Schleife mit Find mit Dateinamen, die Leerzeichen enthalten

Shell-For-Schleife mit Find mit Dateinamen, die Leerzeichen enthalten

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 lsobigen 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 ... -print0und 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 -rstellt sicher, dass Backslashs keine Escape-Zeichen darstellen (so dass das \tbeispielsweise einem tatsächlichen Backslash gefolgt von einem tund nicht einem Tabulator entspricht).

verwandte Informationen