Warum schreibt grep -r --include = *. Js *> dirname / .filename nicht alle .js-Dateien in eine einzige Datei?

347
user5448026

Ich versuche, alle js-Dateien in einem Verzeichnis und in Unterverzeichnissen in einer einzigen Datei in lexikalischer Reihenfolge abzulegen. Was habe ich falsch gemacht?

1
Würde `cat $ (find ./-type f -name" * .js "| sort)> dirname / .filename` für Sie funktionieren? txtechhelp vor 8 Jahren 2
@txtechhelp danke. es ist nah, aber Dateien mit den Namen 2.js und 3.js werden über einer Datei /dirname/1.js abgelegt. Wenn das behoben werden kann, würde es gut funktionieren. user5448026 vor 8 Jahren 0
Ich kann einfach eine 1 vor dem dir-Namen setzen, aber es wäre gut, das nicht tun zu müssen. user5448026 vor 8 Jahren 0
Müssen Sie den Verzeichnisnamen in Ihre Liste aufnehmen? Oder brauchen Sie nur die Dateinamen, wo immer sie herkommen? vor 8 Jahren 0

1 Antwort auf die Frage

0
ams

grepist das falsche Werkzeug dafür, zum Teil weil es nur Zeilen aus den Dateien ausgibt, die dem von Ihnen gegebenen Muster entsprechen (und vermutlich Sie möchten alle Zeilen), und zum Teil, weil Sie kein Muster angegeben haben, also den ersten Dateinamen als das Muster (was nicht hilfreich ist).

Das Auflisten aller *.jsDateien ist einfach genug:

find . -name '*.js' 

Und die Verkettung zu einer Datei ist ebenfalls einfach:

find . -name '*.js' | xargs cat 

Es ist jedoch schwieriger, sie nach der lexikalischen Reihenfolge des Dateinamens zu sortieren und das Verzeichnis, in dem sie sich befinden, zu ignorieren.

Einfach sortnicht erledigt den Job, und es gibt keine --keyOption, die das letzte Feld auswählen wird, wenn die Anzahl der Felder unbekannt ist.

Der folgende Befehl verwendet sed, um den Dateinamen an den Anfang der Zeile zu verschieben, sortiert diesen und entfernt ihn dann wieder.

find . -name '*.js' | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2- 

Dies funktioniert nicht richtig, wenn einer Ihrer Datei- oder Verzeichnisnamen Leerzeichen enthält.

Sie können den Inhalt dann extrahieren, indem Sie Folgendes hinzufügen cat:

find . -name '*.js' \ | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2- \ | xargs cat