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.

Daniel
quelle
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
cuonglm
quelle
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}"
Polym
quelle
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%/}
Gilles 'SO - hör auf böse zu sein'
quelle
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).
c-tools
quelle
1

Du kannst tun:

ls -td -- ../parent/* | head -n 1
Ihr Sohn
quelle
Dies gibt die neueste Datei. Daniel will nur Verzeichnisse.
Gilles 'SO - hör auf, böse zu sein'