Newsgroup: it.comp.os.linux.sys
Titolo: spostare files vecchi

Periodicamente (ogni 5 minuti) dovrei spostare dei file da una dir ad
un'altra specificate, e so come farlo con crontab. Il problema e' che il
file (di nome sempre diverso e non predittibile) potrebbe essere in fase
di elaborazione o di scrittura da parte di un altro programma. L'unico
modo e' che lo script si accerti che l'ultima modifica risale a, diciamo
3, 4 minuti prima. Qualche anima pia mi da' un suggerimento?

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
flodim ha scritto:

man find
- --
Dario Basile
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDxqKe7mRkrRsDl/8RAqGGAJ4kiL6FxIlsNd55SjmVCCZFA0XBrgCeOHOY
kpa2naiOYQ6wYIxJGPrlAK8=
=ewE5
-----END PGP SIGNATURE-----

 3, 4 minuti prima.
crea uno script simile a questo:
(il 300 e' il numero di secondi, pari a 5 minuti)
================================================
#!/bin/bash
filedarimuovere=`find /percorso/ -type f`;  
for a in $filedarimuovere; do
      	b=$[ `date +%s` - `stat -c%Z $a` ];
	        if [ $b -gt 300 ]
                then rm $a;
	        fi ;
done
================================================
controlla magari la man page di stat, per sapere se va bene %Z o ti serve %Y 
oppure %X
e fai le prove commentando il rm $a, magari sostituendolo con
echo "il file $b andrebbe cancellato";
ciao,
Manuel

 ================================================
funziona alla grande :) grazie!
e' una soluzione elegante e precisa. Dalla man di find (grazie Dario) io
avevo elaborato questo:
find /percorso/* -amin +5 | xargs -0 /usr/sbin/hidefiles.sh
con hidefiles:
#!/bin/bash
mv $1 /percorso_finale


Posso darti tonnellate di esempi dove files non modificati in ore sono ancora
aperti... Io userei lsof o equivalente. A meno che tu non ami le scommesse ;-)
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 
il problema si complica notevolmente se i file sono ereditati da windows e
quindi contengono spazi. Il must e' che non vengano toccati se non sono
chiusi da almeno 5 minuti, quindi
find /percorso/* -amin +5 | xargs -0 altroscript
andrebbe bene, ma altroscript eredita ($1) solo una serie di stringhe che
a video (echo) mostra come:
questo maledetto file con gli spazi nel nome#1
questo maledetto file con gli spazi nel nome#2
questo maledetto file con gli spazi nel nome#3
mentre mv vede come:
file#1: questo
file#2: maledetto
ecc...
sembra una cosa senza via d'uscita. C'e' modo di avere da find un output
che, spazi o no nel nome, identifichi univocamente un file?
Grazie per la pazienza :)

 che, spazi o no nel nome, identifichi univocamente un file?
Dai un'occhiata all'opzione -print0 di find.
-- 
Per rispondermi, togli il nome del poeta

 Dai un'occhiata all'opzione -print0 di find.
gia' fatto ma non va bene: print0 da solo una stringa lunga con tutti i
files. Ancrebbe bene l'opzione -ls se non fosse che da come output
stringhe con tutti i permessi ed altro che in uno script danno fastidio
(non c'e' verso di togliere il formato ls -dils da questa opzione di find).
Insomma sono in un bel guaio.

 files.
Ciao,
 l'opzione -print0 di find funziona bene con l'opzione --null di xargs:
find ... -print0 | xargs mv --target-directory/newdir
 Ciao
 Federico

 che, spazi o no nel nome, identifichi univocamente un file?
Le virgolette.
Bash Guide for Beginners
http://www.tldp.org/LDP/Bash-Beginners-Guide/html/index.html
Advanced Bash-Scripting Guide
http://www.tldp.org/LDP/abs/html/index.html
- --
Dario Basile
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDyrc/7mRkrRsDl/8RAm1kAKDSZUMdz3t2PhxKwRnj20Of5gzqWgCgjhMw
2HCKuWlZmSyRAAM2IcyzKVM=
=L898
-----END PGP SIGNATURE-----

chi provera' a seguire il tuo teorema si trovera' di fronte a frustrazioni
inevitabili (la parola a loro), chi invece applica lo script seguente
(nonostante sia scritto da un beginners - e' vero, non sono ironico) si
ritrova con le seguenti funzionalita' (che sono cio' che a me serviva): 1.
i file vengono "trattati" solo se sono senza accessi da + di 5 minuti; 2.
sui file viene fatta una scansione con clamav (aggiornato ogni tot ore) e
se sono infetti vengono messi in quarantena ed il risultato loggato,
altrimenti;
3. vengono spostati nella directory finale. Ovviamente non si tratta di
mail, ma di file in download. Prova a farlo con le virgolette, poi ne
riparliamo.
Lo script:
#!/bin/bash
origdir=/origin_directory
testdir=/dir_testing
destdir=/dir_tested
bad_dir=/dir_infected
#echo $origdir $testdir $destdir
ls $origdir > $testdir/.list
while read -r file
do 
pathtofile=$origdir/$file
        #echo "$pathtofile"
        lastaccesstime=$[ `date +%s` - `stat -c%Z "$pathtofile"` ];
        #       echo "$file" "$pathtofile";
        #       echo "$lastaccesstime";
        if [ $lastaccesstime -gt 300 ]
        # kill_spaces.sh: change " " in "_"
        then
        newname=`echo "$file" | sed -e 's/\ /_/g'`
        #       echo $newname
        #       echo "$testdir/$newname"
        mv "$pathtofile" "$testdir/$newname"
        # scan file with clamav
        clamscan --infected --move=$bad_dir --log=$bad_dir/clamscan.log "$testdi
r/$newname";
        # finally move the file or dir if it has not been quarantined by clamav
        if [ -w "$testdir/$newname" ]
        then
        mv "$testdir/$newname" $destdir;
        fi ;
        fi ;
done < $testdir/.list
Infine dissento sul primo argomento, ma non credo di essere in cattiva
compagnia:
http://www.cs.iastate.edu/~cs104/notes/unix1.html
   (Quoting/escapes)
Ciao

  Federico
davvero non voglio spazientirti, ma xargs -0 non produce il risultato
sperato: a video ok (se ci metto echo), ma mv vede solo i pezzi del nome e
li considera + files.
Cmq ho risolto con uno scriptino postato poco + sopra in risposta a Dario.
Grazie, ciao.

 
http://www.cs.iastate.edu/~cs104/notes/unix1.html
   (Quoting/escapes)
Copio e incollo: The official way to tell the computer that you mean
exactly what you typed is with single quotes
Che dire... Complimentoni! :-)
- --
Dario Basile
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDyuRK7mRkrRsDl/8RAmiiAJ9F5TzFOX1QIy9EWhBYj96itjjQsgCgi2hE
1FR28NW3MGH6pxHDXCsY3a0=
=91dT
-----END PGP SIGNATURE-----

 
vedi io ho risposto cosi' per la tua aria professorale. Ti sfido a
sfornare uno script che funzioni e faccia quelle operazioni (prova pure il
mio, anzicche' rotolarti dal ridere, esiste il copia incolla) e postalo.
Lo proveremo tutti se funziona con le sole virgolette.
Su una cosa hai ragione: mi sono espresso male: dissento dal fatto che
maneggiare i nomi di file con gli spazi sia una passeggiata.
Ripeto, scendi dal trono e scrivi questo script, proveremo se bastano le
sole virgolette.

 
copio e incollo:
If you really, really want a filename with spaces or funny symbols, don't.
But if you really, really, really want it, or someone else has one you
need to use, here's how.
Le ho provate tutte con find e non c'era verso. Il passaggio nel file
.list e' solo uno stratagemma proprio perche' le virgolette xargs -0,
ecc., non bastavano: prova.

 sole virgolette.
Non e' per rotolarmi dal ridere, ma forse non ti sei accorto che lo
script che hai postato usa proprio ''le sole virgolette'' per gestire
gli spazi nei nomi dei file, anche perche' non serve altro. :-)
- --
Dario Basile
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDyuhW7mRkrRsDl/8RAl7GAJwOgkT9iISbBgL6pfCGs5nXXOZMWQCg27FO
n/Os0nyjW3ko3RowzVQ/cdY=
=TipB
-----END PGP SIGNATURE-----

 Le ho provate tutte con find e non c'era verso.
Che intendi?
PS: hai l'orologio spostato di un'ora in avanti.
- --
Dario Basile
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDyuir7mRkrRsDl/8RAsd7AKDs6lLiEEQ03Bww5O2cecmbzd1GxgCeN+64
fHTi5+loeKXXdgE9BnWEHNg=
=I+Ql
-----END PGP SIGNATURE-----

 done
restituisce sempre
stat: cannot stat `test/prov': No such file or directory
./prova.sh: line 6: 1137377635 -  : syntax error: operand expected (error token is " ")
Ciao e scusa per il tono un po' eccessivo :)

 Ciao e scusa per il tono un po' eccessivo :)
Di nulla, semplicemente non c'eravamo capiti.
Io parlavo di virgolette per spostare i file con gli spazi nel nome, tu
di come individuarli.
- --
Dario Basile
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDy5ki7mRkrRsDl/8RAoOqAJ95gpSd6eFffNOurWr6TBnB8/7BDQCfRK/8
KwasTT9ulj7e88r7/geHPAg=
=iW/k
-----END PGP SIGNATURE-----

 e li considera + files.
Ciao,
 tranquillo, non mi sono spazientito ... ma incuriosito si'!
Forse non sono stato abbastanza attento, ma mi sembra che tu abbia solo 
usato l'opzione -0 di xargs senza usare, contemporaneamente, -print0 con 
find ...
In realta' io ho scritto l'esempio sbagliato:
find ... -print0 | xargs -0 mv --target-directory/newdir
 Ciao
 Federico

 
fichissimo :) ha funzionato con:
find test/* -amin +5 -print0 | xargs -0 mv --target-directory=dest_dir
un'opzione che non riuscivo a trovare nelle man pages.
http://www.gnu.org/software/coreutils/manual/html_node/coreutils_5.html
ciao e grazie.

 
Questo dovrebbe andare con le dovute correzzioni:
#!/usr/bin/perl
my $filename;
@filelist = `find /tmp/test -amin +5`;
for ($count=0; $count <= $#filelist; $count++) { 	
 $filename = $filelist[$count]; 
 $filename =~ s/\n//g;
 $filename =~ s/ /\\ /g;
 $cmd = 'cp ' . $filename . ' /tmp/backup';
 `$cmd`;
}
 Ciriciao
  Gio'
-- 
/*
 * Solutions for New Business - 
http://www.snb.it
 */

   Gio'
mmm
scusa se rispondo a te, ma non riesco a raggiungere la cima del thread
ma perche' non fare
find /tmp/test -amin +5 -exec cp "{}" /tmp/backup \;
-- 
Evangelion e' la storia yaoi di un angelo che vuole portarsi a letto un
ragazzo che si intreccia con la storia di un maturo professionista con il
complesso delle lolite... fatte in casa.
                                                            -- Lennier, 2006