web-dev-qa-db-fra.com

Obtenez le dernier annuaire (pas le dernier fichier)

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.

15
Daniel

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
24
cuonglm
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}"
5
polym

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
2
Herson