|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
[Bash scripting] Verificare data di modifica di un file
Ciao,
sono ancora qua per rompervi con i miei problemi con il bash scripting. Questa volta il problema,imho, e' abbastanza ostico. Io devo creare uno script che controlli la data di modifica di un file e se e' inferiore ad un ora eseguire un operazione. Facendo una ricerca avevo pensato di usare l'opzione -atime di ls, pero' non sono riuscito a fare un ciclo if decente. Avete consigli? grazie
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Più che ls, userei stat (v. stat --help, in particolare il parametro --format) così da avere direttamente un valore numerico utilizzabile.
Sposto in programmazione.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Grazie, comunque ho trovato anche la funzione date -r file che fa la stessa cosa.
Adesso la mia domanda e': Come posso lavorare con le date? Io vorrei fare una cosa cosi': Codice:
var = $data_di_oggi - $data_ultima_modifica if var >= maggiore di un ora then ... ... else ... ...
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Oppure (meglio) puoi usare direttamente find; ad es. questo:
find ./ -type f -mtime +<n> -exec <tuo script> {} \; cerca dalla dir corrente tutti i file regolari (-type f) modificati prima di <n> giorni fa (puoi anche usare -mmin specificando i minuti; ad es. -mmin +10), e per ogni corrispondenza invoca un tuo script passando come parametro il file trovato. Puoi implementare la funzione da eseguire dentro lo script.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Molto interessante,
l'unico problemino e' che teoricamente potrebbe trovarmi piu' file, gli posso dare anche il nome del file da cercare=? Un altra domanda: a posto dello script per una funzione gli do il suo nome tipo: -exec <funzione()> {} \;? Ciao e grazie
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Codice:
#!/bin/bash (find [parametri...]) | while read fname do # fai quello che vuoi con "$fname" done
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Grazie mille,
credo che questa soluzione potrebbe funzionare ![]() Pero' ho ancora un problema provando a fare: Codice:
find ./ -type f -name psql -mtime +1; Codice:
[root@probe3 tmp]# ls -la totale 34372 drwxrwxrwt 10 root root 4096 23 ago 10:07 . drwxr-xr-x 23 root root 4096 22 ago 15:27 .. -rw-r--r-- 1 postgres postgres 208110 19 ago 09:15 a.a -rw-r--r-- 1 root root 2753088 18 ago 00:59 ala srwxrwxrwx 1 root root 0 3 ago 18:18 collect.pipe -rw------- 1 root root 28 18 ago 09:35 crontab.XXXXCglLR7 -rw-r--r-- 1 root root 23327394 19 ago 10:41 det.det drwxrwxrwt 2 root root 4096 19 ago 10:52 .esd drwxrwxrwt 2 root root 4096 2 ago 15:45 .font-unix drwx------ 2 root root 4096 19 ago 10:52 gconfd-root srw-rw-rw- 1 root root 0 2 ago 15:46 .gdm_socket drwxrwxrwt 2 root root 4096 19 ago 10:52 .ICE-unix srwxr-xr-x 1 root root 0 2 ago 15:53 mapping-root drwx------ 2 501 501 4096 10 ago 11:28 mc-gstefanoni drwx------ 2 root root 4096 18 ago 17:54 mc-root drwx------ 2 root root 4096 19 ago 10:52 orbit-root -rw-r--r-- 1 root root 2753088 19 ago 02:08 prova -rw-r--r-- 1 root root 2753088 19 ago 02:22 prova; -rw-r--r-- 1 root root 421298 19 ago 09:52 prova.ciao -rw-r--r-- 1 root root 0 22 ago 17:07 psql -rw-r--r-- 1 root root 2753088 19 ago 02:17 script.out srwxrwxrwx 1 postgres postgres 0 23 ago 10:03 .s.PGSQL.5432 -rw------- 1 postgres postgres 26 23 ago 10:03 .s.PGSQL.5432.lock -r--r--r-- 1 root root 11 2 ago 15:46 .X0-lock drwxrwxrwt 2 root root 4096 2 ago 15:46 .X11-unix Quote:
Ciao e grazie ancora
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Ok o letto(spero di aver capito bene), quindi significa che se un file e' stato creato prima di 24 ore fa non posso usare questa funzione. Ma il mio problema e' proprio che devo verificare se il file e' stato creato prima di un ora.
Ciao e scusa per le mie grandi perplessita'
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Allora usa -mmin e specifica i minuti, come è scritto nella manpage e come ti ho già suggerito
![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Avevo gia' provato, ma guarda il risultato:
Codice:
[root@probe3 tmp]# find ./ -type f -name psql -mmin +60; ./psql You have new mail in /var/spool/mail/root [root@probe3 tmp]# find ./ -type f -name psql -mmin +50; ./psql [root@probe3 tmp]# find ./ -type f -name psql -mmin +65; ./psql [root@probe3 tmp]# find ./ -type f -name psql -mmin +10; ./psql [root@probe3 tmp]# find ./ -type f -name psql -mmin +1000; ./psql
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Se vuoi trovare i file modificati da non più di un'ora, utilizza -mmin -60. Puoi anche specificare un intervallo:
find -mmin +60 -mmin -120 trova tutti i file modificati tra una e due ore fa.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Scusami sono proprio un idiota, comunque se io volessi eseguire uno script solo quando il file ha piu' di un ora dovrei modificare il ciclo while o?
Quote:
while read <> fname? Ciao e grazie mille
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Mi sa che non ho ancora capito e non mi sono spiegato bene.
Io ho provato a eseguire questo script: Codice:
#!/bin/bash (find ./ -type f -name psql -mmin +1000;)|while read psql do echo "sto leggendo" done ciao e scusami sempre di piu
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
nb un'ora sono 60 minuti, non 1440 ![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Si questo lo ho capito io vorrei che la condizione fosse se piu vecchio di un giorno cioe' 1440 esegui, mentre adesso e' se piu' giovane di un giorno esegui. Hai capito cosa intendo?
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Certo che -mmin +1440 non ti restituisce nulla, psql _ancora_ non è vecchio di un giorno (24 ore).
Aspetta fino alle 5 di questo pomeriggio e vedrai ![]() (nb se vuoi proprio intendere "i file di ieri", a prescindere dalle ore di differenza, nella info page trovi la soluzione ![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Avevi ragione tu
![]() Pero' io vorrei fare in modo che controlli se e' minore o = ad un ora.... Bye
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:19.