2016-11-14 6 views
4

Ich habe versucht, mehr über Linux zu lernen und habe mich heute Morgen auf den awk-Befehl konzentriert. Der Befehl, den ich versucht habe zu arbeiten, ist unten.Linux CP mit AWK-Ausgabe

ls -lRt lpftp.* | awk '{print $7, $9}' | mkdir -p $(awk '{print $1}') | ls -lRt lpftp.* | cp $(awk '{print $9, $7}') 

Im Grunde bin ich versucht, jede Datei in einem Verzeichnis in ein Unterverzeichnis auf, das Dateien zuletzt geändert Tag basierend zu bewegen. Der Befehl druckt zuerst nur die gewünschten Dateien und erstellt mit mkdir einen Ordner, der auf dem Tag des Monats basiert, an dem er zuletzt geändert wurde. Was ich danach tun will, ist jede Datei in sein zugehörigen Verzeichnis verschieben, aber als der Befehl jetzt ist es jede Datei in die 01 Ordner verschoben und druckt den folgenden Text

cp: 0653-436 12 is a directory. 
    Specify -r or -R to copy. 

einmal für jedes Verzeichnis.

weiß jemand, wie ich dieses Problem beheben kann? oder wenn es einen besseren Weg gibt, darüber zu gehen?

+0

Warum leiten Sie die Ausgabe von 'mkdir' an' ls'? 'mkdir' erzeugt keine Ausgabe (außer Fehlermeldungen) und' ls' verwendet seine Eingabe nicht. – Barmar

+0

Der Grund für die zweite LS-Anweisung war, dass ich nach dem mkdir keinen Zugriff auf den Dateinamen aus dem ursprünglichen LS bekommen konnte, also habe ich ihn erneut ausgeführt, um diese Liste neu zu erstellen. Gibt es eine bessere Methode? – Cronisej

+0

@Cronisej Ja, sehe meine Antwort. – eddiem

Antwort

3

ls -lRt lpftp.* | awk '{print $7, $9}' | while read day file ; do mkdir -p "$day"; cp "$file" "$day"; done

Die Befehle zwischen dodone und werden mit dem ersten, was awk Drucke in den day Variablen und die zweiten in file (pro Zeile) für jede Ausgabezeile ausgeführt werden. Ich habe die Anführungszeichen hier etwas unnötigerweise benutzt, da es in den Variablen keine Leerzeichen geben wird, wenn man die Methode, mit der sie gesetzt werden, verwendet.

1

Der sicherste Weg, um so etwas zu tun - und am schnellsten auszuführen - besteht darin, awk für die Daten zu verwenden, um ein Shell-Skript auszugeben. Drucken Sie in awk die Befehle mkdir und cp, die Sie ausführen möchten. Verlegen Sie die Ergebnisse in Kopf (1), bis Sie zufrieden sind. Vielleicht sehen Sie sich die ganze Sache in weniger (1). Führen Sie dann wie folgt aus:

Das wird die Befehle zu Standardfehler echo und Stop auf den ersten Fehler. Wenn Sie absolut sicher sind, dass es richtig ist, lassen Sie die x Option fallen.

Der Vorteil dieses Ansatzes gegenüber einer Schleife oder einem Bündel von Teilprozessen in awk (mit system Funktion) ist:

  • Sie können sehen, was, passieren wird und was
  • Geschwindigkeit der Ausführung geschieht
Verwandte Themen