Sistema operativo: Linux
Tipo de sistema de archivos: ext3
Solución preferida: bash (script / oneliner), ruby, python
Tengo varios directorios con varios subdirectorios y archivos en ellos. Necesito hacer una lista de todos estos directorios que esté construida de tal manera que cada directorio de primer nivel aparezca junto a la fecha y hora del último archivo creado / modificado dentro de él.
Para aclarar, si toco un archivo o modifico su contenido unos niveles de subdirectorio hacia abajo, esa marca de tiempo debe mostrarse junto al nombre del directorio de primer nivel. Digamos que tengo un directorio estructurado así:
./alfa/beta/gamma/example.txt
y modifico el contenido del archivo example.txt
, necesito que ese tiempo se muestre al lado del directorio de primer nivel alfa
en forma legible para humanos, no en época. He intentado algunas cosas usando Búsqueda xargs
, sort
y los gustos, pero no puedo evitar el problema de que la marca de tiempo del sistema de ficheros de 'alfa' no cambia cuando se crea / modifica los archivos unos niveles más abajo.
fuente
Respuestas:
Prueba este:
Ejecútelo con la ruta al directorio donde debería comenzar a escanear de forma recursiva (admite nombres de archivos con espacios).
Si hay muchos archivos, puede pasar un tiempo antes de que devuelva algo. El rendimiento puede mejorarse si usamos en su
xargs
lugar:que es un poco más rápido
fuente
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Esto es lo que uso: Esto todavía se las arregla para ser rápido para mí.brew install coreutils
usar y usar engstat
lugar destat
stat
ya quefind PATH -type f -printf "%T@ %p\n"| sort -nr
hace el trabajo. También es un poco más rápido de esa manera.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
Para encontrar todos los archivos, ese estado de archivo se modificó por última vez hace N minutos:
find -cmin -N
por ejemplo:
find -cmin -5
fuente
sudo find -cmin -1 2>&1 |grep -v /proc/
GNU Find (ver
man find
) tiene un-printf
parámetro para mostrar los archivos EPOC mtime y el nombre de ruta relativo.fuente
tail
para evitar que se impriman miles de líneas en la salida.awk '{print $2}'
parte parece causar problemas cuando hay nombres de archivo con espacios. Aquí hay una solución que usased
, y también imprime el tiempo además de la ruta:find . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
para crear dicho archivo. Creo que el diseño de utilidades de Unix tiene una gran falla sobre el nombre de archivo.Acorté la increíble respuesta de Halo a esta frase.
Actualizado : si hay espacios en los nombres de archivo, puede usar esta modificación
fuente
IFS=$'\n'
no es seguro en ningún caso cuando se manejan nombres de archivos: las nuevas líneas son caracteres válidos en los nombres de archivos en UNIX. Solo se garantiza que el carácter NUL no estará presente en una ruta.Prueba esto
Se utiliza
find
para recopilar todos los archivos del directorio,ls
para enumerarlos ordenados por fecha de modificación,head
para seleccionar el primer archivo y finalmentestat
para mostrar la hora en un formato agradable.En este momento no es seguro para archivos con espacios en blanco u otros caracteres especiales en sus nombres. Escriba una recomendación si aún no satisface sus necesidades.
fuente
Este comando funciona en Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
En Linux, como preguntaba el cartel original, use en
stat
lugar degstat
.Esta respuesta es, por supuesto, la solución sobresaliente de user37078 , promovida de comentario a respuesta completa. He mezclado en charlesb visión 's para uso
gstat
en Mac OS X. Tengo coreutils de MacPorts en lugar de homebrew , por cierto.Y así es como empaqueté esto en un comando simple
~/bin/ls-recent.sh
para reutilizar:fuente
~/bin/ls-recent.sh
, ¿ha revisado cuidadosamente el script en busca de diferencias?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
Las soluciones perl y Python en esta publicación me ayudaron a resolver este problema en Mac OS X: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-command-avail .
Citando de la publicación:
Perl:
Pitón:
fuente
Ignorar archivos ocultos - con sello de tiempo agradable y rápido
Maneja bien los espacios en los nombres de archivo, ¡no es que debas usarlos!
Se
find
puede encontrar más en abundancia siguiendo el enlace.fuente
Estoy mostrando esto para el último tiempo de acceso, puede modificarlo fácilmente para hacer el último tiempo de modificación.
Hay dos formas de hacer esto:
1) Si desea evitar la ordenación global, que puede ser costosa si tiene decenas de millones de archivos, puede hacer lo siguiente: (ubicarse en la raíz del directorio donde desea que comience la búsqueda)
El método anterior imprime los nombres de archivo con un tiempo de acceso progresivamente más nuevo y el último archivo que imprime es el archivo con el último tiempo de acceso. Obviamente, puede obtener el último tiempo de acceso utilizando una "cola -1".
2) Puede buscar imprimir el nombre de forma recursiva, el tiempo de acceso de todos los archivos en su subdirectorio y luego ordenar en función del tiempo de acceso y la cola de la entrada más grande:
Y ahí lo tienes...
fuente
Tengo este alias en mi perfil que uso con bastante frecuencia.
Por lo tanto, hace lo que está buscando (con la excepción de que no atraviesa el cambio de fecha / hora en varios niveles): busca los archivos más recientes (archivos * .log y * .trc en este caso); también solo encuentra archivos modificados en el último día, luego los ordena por tiempo y canaliza la salida a través de menos:
PD. Tenga en cuenta que no tengo root en algunos de los servidores, pero siempre tengo sudo, por lo que es posible que no necesite esa parte.
fuente
Puede dar el comando printf de buscar un intento
fuente
Función de golpe rápido:
Encuentre el último archivo modificado en un directorio:
También puede especificar su propio formato de fecha / hora como tercer argumento.
fuente
Lo siguiente le devuelve una cadena de la marca de tiempo y el nombre del archivo con la marca de tiempo más reciente:
Resultando a una salida de la forma:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
fuente
Aquí hay una versión que funciona con nombres de archivo que pueden contener espacios, líneas nuevas y caracteres globales también:
find ... -printf
imprime la modificación del archivo (valor EPOCH) seguido de un espacio y\0
nombres de archivo terminados.sort -zk1nr
lee datos terminados en NUL y los ordena inversamente numéricamenteComo la pregunta está etiquetada con Linux, así que supongo
gnu
hay utilidades disponibles.Puede canalizar arriba con:
para imprimir la hora de modificación y los nombres de archivos ordenados por hora de modificación (el más reciente primero) terminados por nuevas líneas
fuente
Esto es lo que estoy usando (muy eficiente):
PROS:
USO:
dónde:
dir
- un directorio para buscar [directorio actual]number
- número de archivos más nuevos para mostrar [10]La salida para se
find_last /etc 4
ve así:fuente
Para una
ls
salida simple , use esto. No hay una lista de argumentos, por lo que no puede ser demasiado larga:Y se justifica con
cut
solo las fechas, horas y nombre:EDITAR : Acabo de notar que la respuesta principal actual se ordena por fecha de modificación. Eso es igual de fácil con el segundo ejemplo aquí, ya que la fecha de modificación es la primera en cada línea: coloque una clasificación al final:
fuente
Esto también se puede hacer con una función recursiva en bash
Sea F una función que muestre la hora del archivo que debe poder clasificarse lexicográficamente aaaa-mm-dd, etc. (¿dependiente del sistema operativo?)
R la función recursiva que se ejecuta a través de directorios
Y finalmente
fuente