Mon dossier parent
a le contenu suivant:
A.Folder B.Folder C.File
Il a à la fois des dossiers et des fichiers à l'intérieur. B.Folder
est plus récent. Maintenant je veux juste obtenir B.Folder
, comment pourrais-je y arriver? J'ai essayé cela,
ls -ltr ./parent | grep '^d' | tail -1
mais ça 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 faites ls
Trier par délai de modification, le plus récent en premier.
Si vous voulez enlever /
:
$ ls -td -- */ | head -n 1 | cut -d'/' -f1
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2
Différence à Solution de Herson est la barre oblique après *
, qui rend la coque ignorer tous les fichiers non dir. Différence à gnouc , cela fonctionnera si vous êtes dans un autre dossier.
Couper a besoin de connaître le nombre de répertoires parent (2) afin de supprimer la trailing '/'. Si vous ne l'avez pas, utilisez
VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"
Réponse de ZSH obligatoire:
latest_directory=(parent/*(/om[1]))
Les caractères entre parenthèses sont Glob Qualifics : /
Pour correspondre uniquement aux annuaires, om
pour trier les matchs en l'âge croissant et [1]
Pour ne conserver que le premier match (c'est-à-dire le plus récent). Ajouter N
Si vous souhaitez obtenir un tableau vide (normalement, vous obtenez un tableau 1-Elementy) s'il n'y a pas de sous-répertoire de parent
.
Alternativement, en supposant que parent
ne contient aucun caractère de globe shell:
latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory
Si vous n'avez pas de ZSH, mais vous avez récemment GNU Outils (c'est-à-dire Linux non intégré ou cygwin), vous pouvez utiliser find
, mais c'est encombrant. Voici aller simple:
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 longtemps que aucun nom de répertoire contient de nouvelles lignes ou (sur certains systèmes) caractères non imprimables:
latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}
Tu peux faire:
ls -td -- ../parent/* | head -n 1