2011-03-13 11 views
11

Tengo dificultades para listar los archivos modificados en un mes específico (por ejemplo, febrero). Aquí hay varios intentos fallidos:UNIX/BASH: archivos de listado modificados en el mes específico

1) He intentado crear archivos temporales y el establecimiento de su marca de tiempo para la primera vez en el próximo mes y la primera vez en el mes de destino y utilice -newer en hallazgo, así:

find -newer "$from" ! -newer "$to" 

Lista de archivos modificados en el intervalo de tiempo ($ from, $ to), pero me gustaría el intervalo de tiempo [$ from, $ to) (de lo contrario, habría falsos positivos en los archivos creados en el primer segundo en el próximo mes). La inclusión de archivos modificados en febrero es un problema adicional, ya que esto requeriría establecer una de las marcas de tiempo en la más grande todavía en febrero, pero el número de días en febrero varía según sea un año bisiesto o no, lo que requiere una verificación adicional .

2) Si uso ls veo muchas complicaciones al analizar, debido a la posibilidad de que el nombre de usuario o grupo contenga espacios en blanco.

¿Hay una forma fácil y relativamente portátil de hacerlo (por lo que funciona durante cualquier mes, independientemente de los nombres de archivo, etc.)?

+1

Usted [no debe analizar 'ls'] (http://mywiki.wooledge.org/ParsingLs) como has descubierto. –

Respuesta

15

dateallows que permite generar fácilmente marcas de tiempo para los propósitos tales como que:

date -d "01-Mar-2011 -1 sec" # last second of Feb-2011 

Afortunadamente, la misma sintaxis es posible en find:

month="Mar-2010" 
find . -newermt "01-$month -1 sec" -and -not -newermt "01-$month +1 month -1 sec" 

encontrará todos los archivos modificados en el de marzo de 2010

0

Una solución podría ser utilizar la opción -printf a find:

find -printf "%Cm %p\\n"| egrep ^02 |cut -b4- 

No creo find puede filtrar el resultado -printf sí mismo, ni puede filtrar por elementos de fecha.

edición o si realmente desea que la salida -como ls:

find -printf "%Cm " -ls | egrep ^02 |cut -b4- 
+0

No estoy seguro de qué tan portátil es '-printf'. Solaris no parece tenerlo. – Mat

3

Bueno, puedo crear archivos que tienen la marca de tiempo mínimo y la marca de tiempo máximo en febrero, y archivos que son sólo más allá de febrero en cada dirección.

$ touch -t 201102010000.01 from 
$ touch -t 201102282359.59 to 
$ touch -t 201103010000.01 march 
$ touch -t 201101312359.59 january 

$ ls -l 
total 0 
-rw-r--r-- 1 mike None 0 Feb 1 00:00 from 
-rw-r--r-- 1 mike None 0 Jan 31 23:59 january 
-rw-r--r-- 1 mike None 0 Mar 1 00:00 march 
-rw-r--r-- 1 mike None 0 Feb 28 23:59 to 

Luego, al usar GNU 'encontrar' de este modo parece mostrar solo los archivos cuya marca de tiempo es en febrero.

$ find -newermt '2011-02-01' ! -newermt '2011-03-01' -print 
./from 
./to 

No sé qué tan portátiles son estos argumentos para otras versiones de 'encontrar'.

1

Añadiendo a la respuesta de Pumbaa80:

En mi entorno de preproducción, find no admite -newermt.

Lo que hice en cambio, fue:

  1. obtener una lista de todos los archivos posibles (a través de find, ls etc.)
  2. Generar las marcas de tiempo del último segundo del mes pasado y este mes

    LAST_MONTH=$(date -d "01-Jun-2015" -1 sec +%s) 
    THIS_MONTH=$(date -d "31-Jul-2015" +%s) 
    
  3. Iterate sobre la lista del punto 1 y compara la marca de tiempo de cada archivo con las marcas de tiempo del punto 2

    for file in $LIST_OF_FILES 
    do 
        TIMESTAMP=$(stat -c"%Y" $file) 
        if (($LAST_MONTH < $TIMESTAMP)) 
        then 
         if (($TIMESTAMP < $THIS_MONTH)) 
         then 
         echo "Your code here" 
         fi 
        fi 
    done 
    
Cuestiones relacionadas