Buscando un comando que devolverá el archivo más reciente en un directorio.
No ver un parámetro de límite para ls
...
linux
command-line
ack
fuente
fuente
watch -n1 'ls -Art | tail -n 1'
- muestra los últimos archivosls
o el usofind
sin el-print0
cual es problemático para manejar nombres de archivos molestos. Siempre es útil mencionar: BashFAQ099 que da una respuesta POSIX a este problemaRespuestas:
No muy elegante, pero funciona.
fuente
ls
atail
, luego imprime solo la última línea. En mi humilde opinión, es mejor ordenar en orden ascendente y utilizarhead
en su lugar, como sechaos
sugiere. Después de imprimir la primera línea, el encabezado se cierra, por lo que enviar la siguiente línea (en realidad el siguiente bloque) generará un SIGPIPE y también sels
cerrará.Este comando realmente proporciona el último archivo modificado en el directorio de trabajo actual.
fuente
ls -tl | head -n 1
, y no tiene que empujar toda la tabla a través de la tubería como lo hace la mía.ls -t *.png | head -n1
ls -Art | head -n1
si desea específicamente el archivo modificado más recienteEsta es una versión recursiva (es decir, encuentra el archivo actualizado más recientemente en un directorio determinado o en cualquiera de sus subdirectorios)
Editar: usar en
-f 2-
lugar de-f 2
lo sugerido por Kevinfuente
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
, puede usar enhead -n 1
lugar detail -n 1
mejorar ligeramente la eficiencia. (Aunque si está ordenando un hallazgo recursivo, obtener la primera o la última línea no será la parte lenta).find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
Una nota sobre confiabilidad:
Dado que el carácter de nueva línea es tan válido como cualquier otro en un nombre de archivo, cualquier solución que se base en líneas como las
head
/tail
basadas son defectuosas.Con GNU
ls
, otra opción es usar la--quoting-style=shell-always
opción y unabash
matriz:(agregue la
-A
opciónls
si también desea considerar los archivos ocultos).Si desea limitarse a archivos normales (ignorar directorios, fifos, dispositivos, enlaces simbólicos, sockets ...), deberá recurrir a GNU
find
.Con bash 4.4 o posterior (para
readarray -d
) y GNU coreutils 8.25 o posterior (paracut -z
):O recursivamente:
Lo mejor aquí sería usar
zsh
y sus calificadores globales en lugar debash
evitar toda esta molestia:El archivo regular más nuevo en el directorio actual:
Incluidos los ocultos:
Segundo más nuevo:
Verifique la antigüedad del archivo después de la resolución del enlace simbólico:
Recursivamente:
Además, con el sistema de finalización (
compinit
y co) habilitado, se Ctrl+Xmconvierte en un completer que se expande al archivo más nuevo.Entonces:
Te haría editar el archivo más nuevo (también tienes la oportunidad de verlo antes de presionar Return).
Para el segundo archivo más nuevo.
para el
c
archivo más nuevo .para el archivo regular más nuevo (no directorio, ni fifo / dispositivo ...), y así sucesivamente.
fuente
zsh
consejos. ¿Podría proporcionar un enlace a más detalles sobre esto en zsh docs?info zsh qualifiers
Yo suelo:
ls -ABrt1 --group-directories-first | tail -n1
Me da solo el nombre del archivo, excluyendo las carpetas.
fuente
ls -lAtr | tail -1
Las otras soluciones no incluyen archivos que comienzan con
'.'
.Este comando también incluirá
'.'
y'..'
, que puede o no ser lo que desea:ls -latr | tail -1
fuente
Variante en corto basada en la respuesta de dmckee:
fuente
-1
sintaxis de head ha quedado obsoleta hace bastante tiempo y-n 1
debe usarse.Me gusta
echo *(om[1])
(zsh
sintaxis) ya que solo da el nombre del archivo y no invoca ningún otro comando.fuente
La solución de búsqueda / clasificación funciona muy bien hasta que el número de archivos se vuelve realmente grande (como un sistema de archivos completo). Use awk en su lugar para realizar un seguimiento del archivo más reciente:
fuente
Personalmente, prefiero usar la menor cantidad de
bash
comandos no incorporados que pueda (para reducir la cantidad de costosas bifurcaciones y syscalls de ejecutivos). Para ordenar por fecha sels
necesita llamar. Pero el uso dehead
no es realmente necesario. Uso el siguiente one-liner (solo funciona en sistemas que admiten canalizaciones de nombres):o para obtener el nombre del archivo más antiguo
(¡Cuidado con el espacio entre las dos marcas '<'!)
Si los archivos ocultos también son necesarios, se podría agregar un argumento.
Espero que esto pueda ayudar.
fuente
usando la opción recursiva R ... puede considerar esto como una mejora para buenas respuestas aquí
fuente
Mostrará el último elemento modificado en la carpeta. Emparejar
grep
para encontrar las últimas entradas con palabras clavefuente
1
es para la primera línea equiv ahead -n 1
lo que es q?Recursivamente:
fuente
prueba este simple comando
Si desea el nombre del archivo - última modificación, ruta = /ab/cd/*.log
Si desea el nombre del directorio - última modificación, ruta = / ab / cd / * /
fuente
Suponiendo que no le importan los archivos ocultos que comienzan con un
.
De otra manera
fuente
Con solo Bash incorporados, siguiendo de cerca BashFAQ / 003 :
fuente
Todas esas soluciones ls / tail funcionan perfectamente bien para archivos en un directorio, ignorando subdirectorios.
Para incluir todos los archivos en su búsqueda (recursivamente), se puede usar find. gioele sugirió ordenar la salida de búsqueda formateada. Pero tenga cuidado con los espacios en blanco (su sugerencia no funciona con espacios en blanco).
Esto debería funcionar con todos los nombres de archivo:
Esto ordena por mtime, mira man find:
Así que simplemente reemplace
%T
con%C
para ordenar por ctime.fuente
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
O alternativamente, mantenga todos excepto el primer campo:find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
Encontrar el archivo más actual en cada directorio de acuerdo con un patrón, por ejemplo, los subdirectorios del directorio de trabajo que tienen un nombre que termina con "tmp" (no distingue entre mayúsculas y minúsculas):
fuente
fuente
Si desea obtener el archivo modificado más reciente que también incluye subdirectorios, puede hacerlo con este pequeño oneliner:
Si desea hacer lo mismo no para los archivos modificados, sino para los archivos accedidos, simplemente tiene que cambiar el
% Y parámetro de la stat comando para % X . Y su comando para los archivos accedidos más recientes se ve así:
Para ambos comandos, también puede cambiar el parámetro var = "1" si desea enumerar más de un solo archivo.
fuente
También necesitaba hacerlo, y encontré estos comandos. estos funcionan para mí:
Si desea el último archivo por su fecha de creación en la carpeta (hora de acceso):
Y si desea el último archivo que tiene cambios en su contenido (modificar el tiempo):
fuente