Obtenez le dernier répertoire (pas le dernier fichier)

15

Mon dossier parenta le contenu suivant:

A.Folder B.Folder C.File

Il contient à la fois des dossiers et des fichiers. B.Folderest plus récent. Maintenant, je veux juste obtenir B.Folder, comment pourrais-je y parvenir? J'ai essayé ça,

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.

Daniel
la source
1
utilisez cecils -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا
Utiliser awk fonctionne, mais je veux voir s'il existe une solution plus propre. :)
Daniel
trouver . -maxdepth 1 -type d | TZ = utc xargs ls -ld - à temps plein | sort -k 6
ctrl-alt-delor

Réponses:

24

Essaye ça:

$ ls -td -- */ | head -n 1

-tles options font le lstri par heure de modification, la plus récente en premier.

Si vous souhaitez supprimer /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
cuonglm
la source
1
Comment se débarrasser des slash /?
Daniel
Cela ne fonctionne pas si vous êtes dans un autre dossier. Je veux dire ls -td -- ./parent | head -n 1ne me donne pas les résultats corrects, dois-je utiliser un sous-shell comme à cd ./parentchaque fois et exécuter cette commande? Toute solution?
Daniel
@Daniel: Vous devez exécuter ma réponse dans le répertoire de travail actuel pour que cela fonctionne. Sinon, vous devez utiliser un chemin relatif comme la réponse de Herson.
cuonglm
La suppression du dernier / ne fonctionne pas. Exemple: / home / cuo / bin / Attendu: / home / cuo / bin
Marius
5
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 fichiers non-dir. Différence avec Gnouc , cela fonctionnera si vous êtes dans un autre dossier.

Cut a besoin de connaître le nombre de répertoires parents (2) afin de supprimer les «/» de fin. Si vous n'en avez pas, utilisez

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"
polym
la source
3

Réponse zsh obligatoire:

latest_directory=(parent/*(/om[1]))

Les caractères entre parenthèses sont des qualificatifs globaux : /pour correspondre uniquement aux répertoires, ompour trier les correspondances en augmentant l'âge et [1]pour ne conserver que la première (c'est-à-dire la plus récente) correspondance. Ajoutez Nsi vous voulez obtenir un tableau vide (normalement vous obtenez un tableau à 1 élément) s'il n'y a pas de sous-répertoire de parent.

Alternativement, en supposant qu'il parentne contienne aucun caractère de remplacement de 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'est-à-dire Linux non intégré ou Cygwin), vous pouvez l'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 existe une solution simple avec ls, qui fonctionne tant qu'aucun nom de répertoire 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%/}
Gilles 'SO- arrête d'être méchant'
la source
2

Tu peux faire:

ls -td -- ../parent/* | head -n 1
Son fils
la source
Cela donne le dernier fichier. Daniel ne veut que des répertoires.
Gilles 'SO- arrête d'être méchant'
2

La commande suivante fera le travail même en cas de nom de répertoire contenant de l'espace:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

L'explication mise à jour du contenu des backticks est la suivante:

  • . - le répertoire courant (vous voudrez peut-être spécifier un chemin absolu ici)
  • -mindepth/-maxdepth - restreindre la commande find uniquement aux enfants immédiats du répertoire courant
  • -type d - uniquement les répertoires
  • -exec stat .. - affiche l'heure modifiée et le nom du répertoire de find séparés par un onglet (et non un espace)
  • sort -n -r |head -1 | cut -f2 - date ordonne le répertoire et affiche le nom complet du dernier modifié (même s'il contient de l'espace comme onglet de délimitation par défaut)
c-tools
la source