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 alfaen forma legible para humanos, no en época. He intentado algunas cosas usando Búsqueda xargs, sorty 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
xargslugar: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- | headEsto es lo que uso: Esto todavía se las arregla para ser rápido para mí.brew install coreutilsusar y usar engstatlugar destatstatya quefind PATH -type f -printf "%T@ %p\n"| sort -nrhace 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 | headPara encontrar todos los archivos, ese estado de archivo se modificó por última vez hace N minutos:
find -cmin -Npor ejemplo:
find -cmin -5fuente
sudo find -cmin -1 2>&1 |grep -v /proc/GNU Find (ver
man find) tiene un-printfparámetro para mostrar los archivos EPOC mtime y el nombre de ruta relativo.fuente
tailpara 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
findpara recopilar todos los archivos del directorio,lspara enumerarlos ordenados por fecha de modificación,headpara seleccionar el primer archivo y finalmentestatpara 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- | headEn Linux, como preguntaba el cartel original, use en
statlugar 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
gstaten 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.shpara 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
findpuede 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 ... -printfimprime la modificación del archivo (valor EPOCH) seguido de un espacio y\0nombres de archivo terminados.sort -zk1nrlee datos terminados en NUL y los ordena inversamente numéricamenteComo la pregunta está etiquetada con Linux, así que supongo
gnuhay 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 4ve así:fuente
Para una
lssalida simple , use esto. No hay una lista de argumentos, por lo que no puede ser demasiado larga:Y se justifica con
cutsolo 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