Wie bekomme ich die relativen Pfade mit ls?

8

Ich möchte so etwas tun, um die letzten beiden heruntergeladenen Dateien zu verschieben:

mv ` ls -rt ~/Downloads/ | tail -2 ` .

Gibt leider lsnur die Dateinamen an. Wie kann ich den obigen Code anpassen?

(Bevor jemand darauf hinweist, bin ich mir der Probleme beim Weiterleiten der Ausgabe von bewusst ls. Ich würde dies nur verwenden, wenn ich die fraglichen Dateinamen kenne.)

Tim
quelle
9
Verwenden Sie findstattdessen.
Ignacio Vazquez-Abrams

Antworten:

10

Okay, wenn Sie nicht aufgeben wollen ls, versuchen Sie zumindest, sich von der Gewohnheit zu lösen, Backticks für alles zu verwenden, insbesondere wenn dies xargsbesser passt:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
Geocar
quelle
Ihr xargsgefällt mir mehr als die Backticks. Aber gibt es einen technischen Grund, diese Pfeifenfolge xargsder Verwendung von Backticks vorzuziehen, oder ist dies nur eine Frage des Geschmacks?
Wunder173
In diesem Fall sehen wir uns nur zwei Dateien an. Wenn wir jedoch Tausende von Dateien verschieben möchten, versuchen wir möglicherweise versehentlich, eine zu lange Befehlszeile zu erstellen.
Geocar
Außerdem: Bei nur Hunderten von Dateien können wir sofort mit der Arbeit beginnen. Bei Backticks müssen wir warten, bis der gesamte Unterbefehl fertig ist.
Geocar
Außerdem: Wenn Sie es schaffen, die Gewohnheit des Gebrauchs lsxargs -0
aufzugeben
3
Das Parsen lswird nicht empfohlen
Gilles Quenot
8

Sie können GNU finddort verwenden:

mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .

Die find -printfOptionen:

  • %Tsum die Zeit als Epoche anzuzeigen
  • %p der Dateipfad

Sehen man find | less +/'^ *-printf'

bearbeiten

Wenn Sie Leerzeichen in Dateinamen verwenden müssen, empfehle ich diese andere Lösung:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .
Gilles Quenot
quelle
Erklärungen zu find -printfOptionen
hinzugefügt
1
Ich bin neugierig: Gibt es einen bestimmten Grund, -f2-anstatt -f2als Option zu verwenden cut? Wofür ist der zweite Strich?
Francesco Turco
1
Sicher, Francesco Turco man cutdruckt , wie gesagt , bis zum Ende, wenn es mehr als eine Spalte gibt.
Gilles Quenot
POST bearbeitet, um mit Dateinamen mit Leerzeichen zu arbeiten.
Gilles Quenot
3

Verwenden Sie ls -rt ~/Downloads/*anstelle von ls -rt ~/Downloads/. Im ls -rt ~/Downloads/*Argument wird die Zeichenfolge zuerst von der Shell erweitert (dies wird als Dateiname Globbing bezeichnet ). Sie erhalten also eine Liste von Pfaden als Argumente für den ls -rtBefehl, die dann so sortiert werden, wie Sie es mit den Optionen von angegeben haben ls. Im Gegensatz dazu ls -rt ~/Downloads/liest der Befehl den Inhalt des Verzeichnisses ~/Downloads/. Dies ist eine Liste von Dateien ohne Verzeichnispfad.

Wunder173
quelle
2

Mit zsh:

mv ~/Downloads/*(.om[1,2]) .

Der (...)Teil wird als Globbing-Qualifikation bezeichnet , eine der Killer-Eigenschaften von zsh. Jedes Qualifikationsmerkmal (normalerweise einzelne Zeichen) ermöglicht es, die übereinstimmenden Einträge basierend auf den Attributen der Dateien (Typ, Größe, Zeit ...) zu filtern, die Reihenfolge zu ändern, in der sie erweitert werden, oder zu ändern, wie sie erweitert werden.

Oben haben wir:

  • . (Punkt): Nur reguläre Dateien auswählen (keine Verzeichnisse, Symlinks ...)
  • om: O rder die Liste von m NDERUNG Zeit.
  • [1,2]: Wählen Sie nur die ersten beiden Einträge aus.

Beachten Sie auch, dass der Befehl fehlschlägt, wenn keine Übereinstimmung vorliegt (wo andere Shells versehentlich die falsche Datei / das falsche Verzeichnis verschieben könnten).

Stéphane Chazelas
quelle