Obtenga el directorio más reciente (no el archivo más reciente)

Obtenga el directorio más reciente (no el archivo más reciente)

Mi carpeta parenttiene el siguiente contenido:

A.Folder B.Folder C.File

Tiene carpetas y archivos en su interior. B.Folderes más nuevo. Ahora solo quiero conseguirlo B.Folder, ¿cómo podría lograrlo? Probé 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.

Respuesta1

Prueba esto:

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

-tLas opciones ordenan lspor hora de modificación, las más nuevas primero.

Si quieres eliminar /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

Respuesta2

ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

diferencia conla solución de hersones la barra diagonal después de *, lo que hace que el shell ignore todos los archivos que no sean directorios. diferencia congnouc, funcionará si estás en otra carpeta.

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

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

Respuesta3

Respuesta obligatoria de zsh:

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

Los caracteres entre paréntesis sonclasificatorios globales: /para hacer coincidir sólo directorios, omordenar coincidencias por edad creciente y [1]retener sólo la primera coincidencia (es decir, la más nueva). 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 global de shell:

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

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

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

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

Respuesta4

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

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 entre comillas invertidas es:

  • .- el directorio actual (es posible que desee especificar una ruta absoluta aquí)
  • -mindepth/-maxdepth- restringir el comando de búsqueda solo a los hijos inmediatos del directorio actual
  • -type d- solo directorios
  • -exec stat ..- muestra la hora de modificación y el nombre del directorio de buscar separados por una tabulación (y no un espacio)
  • sort -n -r |head -1 | cut -f2- la fecha ordena el directorio y muestra el nombre completo de la modificación más reciente (incluso si contiene algo de espacio como pestaña delimitadora predeterminada cortada)

información relacionada