Obtenga el último directorio (no el último archivo)

15

Mi carpeta parenttiene el siguiente contenido:

A.Folder B.Folder C.File

Tiene tanto carpetas como archivos dentro. B.FolderEs más nuevo. Ahora solo quiero obtener B.Folder, ¿cómo podría lograr esto? Intenté esto

ls -ltr ./parent | grep '^d' | tail -1

pero me da drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, pero solo necesito el nombre B.Folder.

Daniel
fuente
1
use estols -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا
Usar awk funciona, pero quiero ver si hay una solución más limpia. :)
Daniel
encontrar . -maxdepth 1 -tipo d | TZ = utc xargs ls -ld --full-time | sort -k 6
ctrl-alt-delor

Respuestas:

24

Prueba esto:

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

-tlas opciones hacen lsordenar por hora de modificación, primero las más nuevas

Si quieres eliminar /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
Cuonglm
fuente
1
¿Cómo deshacerse de la barra /?
Daniel
Esto no funciona si está en otra carpeta. Es decir ls -td -- ./parent | head -n 1, no me da los resultados correctos, ¿DEBO usar subshell como cd ./parentcada vez y ejecutar este comando? ¿Alguna solución?
Daniel
@Daniel: Debes ejecutar mi respuesta en el directorio de trabajo actual para que funcione. De lo contrario, debe utilizar una ruta relativa como la respuesta de Herson.
Cuonglm
Eliminar último / no funciona. Ejemplo: / home / cuo / bin / Esperado: / home / cuo / bin
Marius
5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

La diferencia con la solución de Herson es la barra inclinada posterior *, que hace que el shell ignore todos los archivos que no sean dir. A diferencia de Gnouc , funcionará si estás en otra carpeta.

Cut necesita saber el número de directorios principales (2) para eliminar '/' final. Si no tienes eso, usa

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

Respuesta zsh obligatoria:

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

Los caracteres entre paréntesis son calificadores globales : /para hacer coincidir solo directorios, omordenar coincidencias al aumentar la edad y [1]retener solo la primera coincidencia (es decir, la más reciente). Agregue Nsi desea obtener una matriz vacía (normalmente obtiene una matriz de 1 elemento) si no hay un subdirectorio de parent.

Alternativamente, suponiendo que parentno contenga ningún carácter globbing de shell:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

Si no tiene zsh pero tiene herramientas recientes de GNU (es decir, Linux o Cygwin no integrados), puede usarlo find, pero es engorroso. Aquí hay una manera:

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")

Hay una solución simple con ls, que funciona siempre que ningún nombre de directorio contenga nuevas líneas o (en algunos sistemas) caracteres no imprimibles:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}
Gilles 'SO- deja de ser malvado'
fuente
2

Tu puedes hacer:

ls -td -- ../parent/* | head -n 1
Su hijo
fuente
Esto le da el último archivo. Daniel solo quiere directorios.
Gilles 'SO- deja de ser malvado'
2

El siguiente comando hará el trabajo incluso en caso de que el nombre del directorio contenga espacio:

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

La explicación actualizada de las cosas en los backticks es:

  • . - el directorio actual (es posible que desee especificar una ruta absoluta aquí)
  • -mindepth/-maxdepth - restringir el comando de búsqueda solo a los elementos secundarios inmediatos del directorio actual
  • -type d - solo directorios
  • -exec stat .. - genera el tiempo modificado y el nombre del directorio de find separados con una pestaña (y no un espacio)
  • sort -n -r |head -1 | cut -f2 - date ordena el directorio y muestra el nombre completo de la última modificación (incluso si contiene algo de espacio como la pestaña delimitador predeterminado de corte)
herramientas c
fuente