Ich möchte Dateinamen an andere Programme weiterleiten, aber alle ersticken, wenn die Namen Leerzeichen enthalten.
Nehmen wir an, ich habe eine Datei namens.
foo bar
Wie kann ich find
den richtigen Namen zurückgeben?
Natürlich möchte ich:
foo\ bar
oder:
"foo bar"
EDIT : Ich möchte nicht durchgehen xargs
, ich möchte eine korrekt formatierte Zeichenfolge herausholen, find
damit ich die Zeichenfolge der Dateinamen direkt an ein anderes Programm weiterleiten kann.
find
formatiert die Dateinamen gut; Es wird ein Name pro Zeile geschrieben. (Dies ist natürlich mehrdeutig, wenn ein Dateiname ein Zeilenvorschubzeichen enthält.) Das Problem ist also, dass das empfangende Ende "erstickt", wenn es ein Leerzeichen erhält. Dies bedeutet, dass Sie uns mitteilen müssen, was das empfangende Ende ist, wenn Sie eine aussagekräftige Antwort wünschen .
find
eine Option zur Ausgabe von Dateinamen in einem für die Shell geeigneten Format angeboten würde. Im Allgemeinen funktioniert die -print0
GNU- find
Erweiterung jedoch auch in vielen anderen Szenarien, und Sie sollten auf jeden Fall lernen, sie zu verwenden.
ls $(command...)
füttert die Liste nicht durch stdin
. Es setzt die Ausgabe von $(command...)
direkt in die Befehlszeile. In diesem Fall liest die Shell aus c und verwendet den aktuellen Wert von $IFS
, um zu entscheiden, wie die Ausgabe in Wörter aufgeteilt wird. Im Allgemeinen ist es besser, wenn Sie verwenden xargs
. Sie werden keinen Leistungstreffer bemerken.
find -printf '"%p"\n'
fügt jeden gefundenen Namen in doppelte Anführungszeichen ein, fügt jedoch keine doppelten Anführungszeichen in einen Dateinamen ein. Wenn Ihre Dateinamen keine Anführungszeichen enthalten, können Sie das Problem ignorieren: oder durchleiten sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Wenn Ihre Dateinamen von der Shell verarbeitet werden, sollten Sie wahrscheinlich einfache Anführungszeichen anstelle von doppelten Anführungszeichen verwenden (andernfalls sweet$HOME
wird dies zu etwas ähnlichem sheet/home/you
). Und dies ist immer noch nicht sehr robust gegenüber Dateinamen mit Zeilenumbrüchen. Wie wollen Sie damit umgehen?
-exec
Flagge mitfind
? Sie können diesen Fehler möglicherweise beheben und Ihren Befehl effizienter gestalten, indem-exec
Sie ihn nicht an andere Befehle weiterleiten. Nur meine $