Mon dossier parent
a le contenu suivant:
A.Folder B.Folder C.File
Il contient à la fois des dossiers et des files. B.Folder
est plus récent. Maintenant, je veux juste get B.Folder
, comment pourrais-je y parvenir? J'ai essayé ça,
ls -ltr ./parent | grep '^d' | tail -1
mais cela me donne drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder
, mais j'ai juste besoin du nom B.Folder
.
Essaye ça:
$ ls -td -- */ | head -n 1
-t
options make ls
par heure de modification, le plus récent en premier.
Si vous voulez supprimer /
:
$ ls -td -- */ | head -n 1 | cut -d'/' -f1
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2
La différence avec la solution de Herson est la barre oblique après *
, qui fait que le shell ignore tous les files non-dir. La différence avec Gnouc , cela fonctionnera si vous êtes dans un autre dossier.
Cut doit connaître le nombre de directorys parent (2) afin de supprimer '/'. Si vous ne l'avez pas, utilisez
VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"
Réponse zsh obligatoire:
latest_directory=(parent/*(/om[1]))
Les caractères entre parenthèses sont des qualificatifs glob : /
pour ne correspondre qu'aux directorys, om
pour sortinger les correspondances en augmentant l'âge, et [1]
pour conserver uniquement la première (c'est-à-dire la plus récente) correspondance. Ajoutez N
si vous voulez get un tableau vide (normalement, vous obtenez un tableau à 1 élément) s'il n'y a pas de sous-directory de parent
.
Alternativement, en supposant que le parent
ne contient aucun caractère de shell shell:
latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory
Si vous n'avez pas zsh mais que vous avez des outils GNU récents (c.-à-d. Linux non embarqué ou Cygwin), vous pouvez utiliser find
, mais c'est lourd. Voici une façon:
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")
Il y a une solution simple avec ls
, qui fonctionne aussi longtime qu'aucun nom de directory ne contient de nouvelles lignes ou (sur certains systèmes) des caractères non imprimables:
latest_directory=$(ls -td parent/*/ | head -n1) latest_directory=${latest_directory%/}
Tu peux faire:
ls -td -- ../parent/* | head -n 1