¿Cómo verificar que el archivo2 sea más nuevo que el archivo1 en bash?

51

¿Cómo puedo verificar que file2se modificó por última vez después file1?

En este ejemplo, perlse modificó más recientemente que stack. ¿Hay un comando bash o Linux que pueda comparar estos archivos en función del tiempo de modificación?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl
lidia
fuente

Respuestas:

51

Lo encontré aquí

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done
subanki
fuente
14
También -otes "mayor que".
Dennis Williamson
1
Creo que me he encontrado con un problema con esto. Para los archivos con el mismo tiempo de modificación hasta segundos, estas pruebas tienen la "misma" edad; ambos -nt y -ot dan el mismo resultado (falso). En mi caso de uso, tengo un programa que lee los resultados de los demás, y necesito asegurarme de que se hayan ejecutado en el orden correcto. En este caso parece necesario comparar nanosegundos.
sjmc
38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Tomado de ' prueba de hombre '. Extracto:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2
Eddie Parker
fuente
7

Otra forma de hacer esto:

find -name file2 -newer file1

devolverá nulo si el archivo2 es anterior o tiene la misma edad que el archivo1. Devolverá el nombre (y el directorio) del archivo2 si es más nuevo.

Tenga en cuenta que Linux no realiza un seguimiento de cuándo se crearon los archivos. Estas pruebas serán para la fecha y hora de modificación más reciente.

Dennis Williamson
fuente
2
Linux hace un seguimiento del tiempo de creación: se llama ctime. También realiza un seguimiento del último tiempo de acceso: atime. Simplemente usa mtime en general, ya que esta es la última hora de modificación, que es más útil.
Coroos
2
@Coroos: ctimeno es tiempo de creación. Es el tiempo de cambio de inodo y se actualiza cuando los atributos del archivo, como el propietario o los permisos, cambian o cuando modifica el archivo. Algunos sistemas de archivos admiten la hora de nacimiento, pero el núcleo no. La estadística muestra un tiempo de nacimiento vacío. Ver unix.stackexchange.com/a/91200 Tenga en cuenta que OS X admite la hora de nacimientostat -f %SB filename
Dennis Williamson
También vea htrp: //unix.stackexchange.com/a/50184 sobre cómo usar debugfspara ver el tiempo de creación (nacimiento) en Linux.
Dennis Williamson
2

Si desea información más detallada, puede usar el statcomando

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400
Tim Bielawa
fuente
2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Si el resultado es> 0, el primer archivo es más nuevo. (Más reciente en términos de última modificación, no tiempo de creación, que se almacena en Linux).

usuario desconocido
fuente
-nt es generalmente mejor, pero esta sigue siendo una publicación útil ...
BuvinJ
0

Según este enlace, Unix no almacena la fecha de creación. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Pero almacena el último acceso.

para el último acceso

 ls -t  # displays in order of date. So the first one is the 

ls muestra cada archivo en una nueva línea.

entonces ls -t muestra el último archivo en la primera línea, etc.

  • Puede usar usted mismo para elegir la primera línea.
  • Puede usar sed para elegir la primera línea.

    ls -t php.exe php.ini | sed -n '1p' php.ini

podría -lt ver que si no especifica ningún archivo ... y hace el directorio ... entonces da el total en la primera línea, por lo que elige la segunda línea como$ls -lt | sed -n '2p'

Una buena sería

ls -t | head -n 1

o

ls -lt | head   

muestra las primeras 10 líneas en orden, primero el primer archivo modificado y puede ver cuál es

barlop
fuente
-tes el tiempo de modificación; -ues hora de acceso
Dennis Williamson
gracias ... Me preguntaba sobre -u ... la distinción ... y sí, como sugieres ... -t -u ordenado por tiempo ... como el hombre lo tiene. mejor que decir que ordena por fecha.
barlop
aunque tal vez no sea tan bueno como decir ordenado por fecha / hora ;-)
barlop
0

Aquí hay un pequeño guión que hice:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "
usuario744989
fuente
Debería explicar con más detalle lo que está haciendo con algunas referencias para el comando para que las personas que potencialmente lo usen tengan la oportunidad de leerlo o escuchar su desglose un poco más que simplemente probar los comandos y la sintaxis.
Pimp Juice IT