..png)
Mein Ordner parent
hat folgenden Inhalt:
A.Folder B.Folder C.File
Es enthält sowohl Ordner als auch Dateien. B.Folder
ist 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
-t
Mit den Optionen lässt sich ls
nach Ä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, N
wenn 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 parent
kein 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)