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.


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

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

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%/}


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.