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

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

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 bekommen B.Folder, wie könnte ich das erreichen? Ich habe das 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.

Antwort1

Versuche dies:

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

-tMit den Optionen lässt sich lsnach Änderungszeitpunkt sortieren, neueste zuerst.

Wenn Sie entfernen möchten /:

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

Antwort2

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

Differenz zuHersons Lösungist der Schrägstrich nach *, der die Shell alle Nicht-Dir-Dateien ignorieren lässt. Unterschied zuGnouc, es funktioniert, wenn Sie sich in einem anderen Ordner befinden.

Cut muss die Anzahl der übergeordneten Verzeichnisse (2) kennen, um nachfolgende '/' löschen zu können. Wenn Sie diese nicht kennen, verwenden Sie

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

Antwort3

Obligatorische zsh-Antwort:

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

Die Zeichen in Klammern sindGlob-Qualifikation: /um nur Verzeichnisse abzugleichen, omÜbereinstimmungen nach zunehmendem Alter zu sortieren und [1]nur die erste (also neueste) Übereinstimmung beizubehalten. Fügen Sie hinzu, Nwenn Sie ein leeres Array erhalten möchten (normalerweise erhalten Sie ein Array mit 1 Element), wenn kein Unterverzeichnis von vorhanden ist parent.

Alternativ, vorausgesetzt, dass parentkein Shell-Globbing-Zeichen enthalten ist:

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

Wenn Sie kein zsh haben, aber aktuelle GNU-Tools (also nicht eingebettetes Linux oder Cygwin), können Sie verwenden find, aber das ist 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 mit 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%/}

Antwort4

Der folgende Befehl funktioniert, auch 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 der Angaben in den Backticks lautet:

  • .- das aktuelle Verzeichnis (ggf. möchten Sie hier einen absoluten Pfad angeben)
  • -mindepth/-maxdepth- Beschränken Sie den Suchbefehl nur auf die unmittelbar untergeordneten Elemente des aktuellen Verzeichnisses.
  • -type d- nur Verzeichnisse
  • -exec stat ..- gibt die Änderungszeit und den Namen des Verzeichnisses von find aus, getrennt durch einen Tabulator (und nicht durch ein Leerzeichen)
  • sort -n -r |head -1 | cut -f2- date sortiert das Verzeichnis und gibt den vollständigen Namen des zuletzt geänderten Verzeichnisses aus (auch wenn es ein Leerzeichen als Standardtrennzeichen (Tabulator) enthält)

verwandte Informationen