wake-up-neo.net

wie man Dateinamen ausgibt, die mit Anführungszeichen in der EINZELNEN Zeile umgeben werden?

Ich möchte die Liste der Artikel in einem Ordner folgendermaßen ausgeben:

"filename1"  "filename2" "file name with spaces" "foldername" "folder name with spaces"

Mit anderen Worten, Elementnamen müssen in einer einzigen Zeile stehen, zwischen Anführungszeichen (einfach oder doppelt) und durch Leerzeichen getrennt sein.

Ich weiß das

find . | xargs echo

druckt die Ausgabe in einer einzelnen Zeile, aber ich weiß nicht, wie Anführungszeichen um jeden Elementnamen eingefügt werden sollen.

Dieser Code ist Teil eines BSH-Skripts. Die Lösung kann daher eine Reihe von Befehlen sein und temporäre Dateien zum Speichern von Zwischenausgaben verwenden.

Vielen Dank für jeden Vorschlag.

Prost, Ana

22
Ana

das sollte funktionieren

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' '

BEARBEITEN:

Dies sollte effizienter sein als das vorherige.

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '

@ Timofeys Lösung würde am Ende mit einem tr arbeiten und sollte die effizienteste sein.

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
21
freethinker

Sie können auch einfach "-printf" finden, wie in:

find . -printf "\"%p\" " | xargs your_command

woher:

          %p     File's name.

Dadurch werden alle gefundenen Dateien in Anführungszeichen gesetzt und jedes Element durch ein Leerzeichen getrennt. Dadurch werden mehrere Befehle vermieden.

33
Benjamin A.

Versuche dies.

find . -exec echo -n '"{}" ' \;
14
Timofey Stolbov

Sie können die GNU ls-Option --quoting-style verwenden, um ganz einfach herauszufinden, was Sie suchen. Von der Handbuchseite:

--quoting-style=Word

verwenden Sie den Zitierstil Word für Eintragsnamen: literal, locale, Shell, Shell-always, Shell-escape, Shell-escape-always, c, escape

Wenn Sie beispielsweise den Befehl ls --quoting-style=Shell-escape-always verwenden, wird Ihre Ausgabe wie folgt:

'filename1' 'filename2' 'file name with spaces' 'foldername' 'folder name with spaces'

Mit --quoting-style=c können Sie Ihr gewünschtes Beispiel exakt reproduzieren. Wenn die Ausgabe jedoch von einem Shell-Skript verwendet werden soll, sollten Sie eines der Formulare verwenden, das Sonderzeichen wie Shell-escape-always korrekt auslässt.

11
George Hilliard

EDIT:
Die folgende Antwort generiert eine durch neue Zeilen getrennte LISTE anstelle einer einzelnen Zeile.

  1. Ich vermute, dass das OP das Ergebnis für das Aufrufen anderer Befehle verwendet
  2. konvertieren der Ausgabeliste in eine einzelne Zeile ist einfach (| tr '\n' ' ')

Eine weniger erwähnte Methode ist die Verwendung der -d (--delimiter) Option von xargs:

find . | xargs [email protected] -d"\n" echo \"@\" 

[email protected] erfasst jedes find-Ergebnis als @ und wir haben es dann in Anführungszeichen gesetzt

Damit können Sie alle Befehle aufrufen, wie Sie den Argumenten Anführungszeichen hinzugefügt haben.

$ find . | xargs -d"\n" testcli.js
[ "filename1",
  "filename2",
  "file name with spaces",
  "foldername",
  "folder name with spaces" ]

Siehe https://stackoverflow.com/a/33528111/665507

2
leesei
for f in *; do printf "'%s' " "$f"; done; echo

Oder danke an Gordon Davisson :

printf "'%s' " *; echo

Die nachfolgende echo dient einfach dazu, der Ausgabe eine neue Zeile hinzuzufügen.

2
glenn jackman
    find . | sed "s|.*|\"&\"|"

Kurzbeschreibung:
Wir nehmen das Ergebnis von. * Pattern und setzen es in Anführungszeichen.
Gute Quelle ist sed .

Detailbeschreibung:
Muster: s/one/ONE/

  • s Ersetzt den Befehl.
  • /Trennzeichen.
    In meinem Ausdruck "|" wird anstelle von "/" verwendet, um "Berge" wie in Muster s /.*/\"&\"/ zu verhindern.
  • one Mustersuchmuster für reguläre Ausdrücke.
  • ONEErsetzungsstring.
  • . * Bezeichnet ein Symbol, das sich beliebig oft wiederholt.
  • \"Means" selbst.
  • & Sonderzeichen, das dem gefundenen Muster entspricht.
0
iosuser2332

versuchen

ls | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
0
Ferroao