.png)
Mi carpeta parent
tiene el siguiente contenido:
A.Folder B.Folder C.File
Tiene carpetas y archivos en su interior. B.Folder
es 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
-t
Las opciones ordenan ls
por 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, om
ordenar coincidencias por edad creciente y [1]
retener sólo la primera coincidencia (es decir, la más nueva). Agregue N
si desea obtener una matriz vacía (normalmente obtiene una matriz de 1 elemento) si no hay un subdirectorio de parent
.
Alternativamente, suponiendo que parent
no 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)