Obtenir le dernier directory (pas le dernier file)

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