Holen Sie sich das neueste Verzeichnis (nicht die neueste Datei)


15

Mein Ordner parenthat folgenden Inhalt:

A.Folder B.Folder C.File

Es enthält sowohl Ordner als auch Dateien. B.Folderist neuer. Jetzt möchte ich nur noch wissen B.Folder, wie ich das erreichen kann. Ich habe es versucht,

ls -ltr ./parent | grep '^d' | tail -1

aber es gibt mir drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, aber ich brauche nur den Namen B.Folder.


1
Verwenden Sie diesels -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

Awk funktioniert, aber ich möchte sehen, ob es eine sauberere Lösung gibt. :)
Daniel

finden . -maxtiefe 1 -typ d | TZ = utc xargs ls -ld --full-time | sort -k 6
ctrl-alt-delor

Antworten:


24

Versuche dies:

$ ls -td -- */ | head -n 1

-tOptionen lssortieren nach Änderungszeit, neueste zuerst.

Wenn Sie entfernen möchten /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

1
Wie der Schrägstrich loswerden /?
Daniel

Dies funktioniert nicht, wenn Sie sich in einem anderen Ordner befinden. Ich meine, ls -td -- ./parent | head -n 1gibt mir nicht die richtigen Ergebnisse, MUSS ICH Subshell wie cd ./parentjedes Mal verwenden und diesen Befehl ausführen? Irgendeine Lösung?
Daniel

@ Daniel: Sie müssen meine Antwort im aktuellen Arbeitsverzeichnis ausführen, damit es funktioniert. Andernfalls müssen Sie einen relativen Pfad wie Hersons Antwort verwenden.
Donnerstag,

Letztes entfernen / funktioniert nicht. Beispiel: / home / cuo / bin / Erwartet: / home / cuo / bin
Marius

5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Der Unterschied zu Hersons Lösung ist der Schrägstrich danach *, der bewirkt , dass die Shell alle Nicht-Dir-Dateien ignoriert. Anders als bei Gnouc funktioniert es, wenn Sie sich in einem anderen Ordner befinden.

Cut muss die Anzahl der übergeordneten Verzeichnisse (2) kennen, um das abschließende '/' zu löschen. Wenn Sie das nicht haben, verwenden Sie

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

3

Obligatorische Antwort:

latest_directory=(parent/*(/om[1]))

Die Zeichen in Klammern sind Glob-Qualifikationsmerkmale : /Nur Verzeichnisse omabgleichen, Übereinstimmungen nach zunehmendem Alter sortieren und [1]nur die erste (dh neueste) Übereinstimmung beibehalten. Fügen NSie hinzu, wenn Sie ein leeres Array erhalten möchten (normalerweise erhalten Sie ein 1-Element-Array), wenn es kein Unterverzeichnis von gibt parent.

Angenommen, parentes enthält kein Shell-Globbing-Zeichen:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

Wenn Sie nicht über zsh verfügen, aber über neuere GNU-Tools (dh nicht eingebettetes Linux oder Cygwin), können Sie diese verwenden find, sie sind jedoch umständlich. Hier ist eine Möglichkeit:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

Es gibt eine einfache Lösung ls, die funktioniert, solange kein Verzeichnisname Zeilenumbrüche oder (auf einigen Systemen) nicht druckbare Zeichen enthält:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}

2

Der folgende Befehl erledigt die Aufgabe auch dann, wenn der Verzeichnisname Leerzeichen enthält:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

Die aktualisierte Erklärung des Materials in den Backticks lautet:

  • . - das aktuelle Verzeichnis (möglicherweise möchten Sie hier einen absoluten Pfad angeben)
  • -mindepth/-maxdepth - Beschränken Sie den Befehl find nur auf die unmittelbaren untergeordneten Elemente des aktuellen Verzeichnisses
  • -type d - nur Verzeichnisse
  • -exec stat .. - gibt die geänderte Zeit und den Namen des Verzeichnisses von find mit einem Tabulator (und nicht mit einem Leerzeichen) getrennt aus
  • sort -n -r |head -1 | cut -f2 - date ordnet das Verzeichnis an und gibt den gesamten Namen des zuletzt geänderten Verzeichnisses aus (auch wenn ein Leerzeichen als Standardbegrenzungsregisterkarte verwendet wird).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.