Newsgroup: it.comp.os.linux.iniziare
Titolo: verificare il checksum dei file

+ tree
├── a
├── b
├── c
├── my-files.md5
└── sub
+ find . -type f ! -name my-files.md5 -exec md5sum {} \; > my-files.md5
 
Provo a fare il test spostandomi in un'altra directory: sub
 
+ cd sub
+ md5sum -c ../my-files.md5
md5sum: ./test: File o directory non esistente
./test: FAILED open or read
md5sum: ./b: File o directory non esistente
./b: FAILED open or read
md5sum: ./c: File o directory non esistente
./c: FAILED open or read
md5sum: ./a: File o directory non esistente
./a: FAILED open or read
md5sum: ATTENZIONE: 4 file elencati non possono essere letti
 
Per risolvere il problema devo tornare alla directory originale, e 
ripetere il test
 
+ cd -
+ md5sum -c my-files.md5
./test: OK
./b: OK
./c: OK
./a: OK
 
C'è un modo per fare il test senza posizionarsi nella originale?
Mi è venuta qualche idea, ma a quanto pare md5sum non ha l'opzione 
--working-dir.
 
+ cd sub
+ md5sum -c ../my-files.md5 --working-dir=..
md5sum: unrecognized option '--working-dir=..'
Try 'md5sum --help' for more information.


pushd / popd con find e` "dirname".
 
Tipicamente qualcosa come:
 
find . -name MD5SUM |
while read M
do
   D=$( dirname $M )
   pushd $D
   md5sum -c MD5SUM
   popd
done
 
bye
 
-- 
 
piergiorgio

Il 01/07/21 18:02, Piergiorgio Sartor ha scritto:

Si certo, oppure fare in modo che in MD5SUM vengano memorizzati solo 
percorsi assoluti.
 
Dato che ci troviamo avrei quest'altro problema
 
$ cat make-md5
#!/bin/bash
set -eu
 
run() {
     # parametri
     local DIR_NAME=$1
     local MD5_FILENAME=$2
 
     find \
         "$DIR_NAME" \
         -type f \
         ! -name "$MD5_FILENAME" \
         -exec md5sum {} \; \
     > "$MD5_FILENAME"
}
 
run "$@"
$ ./make-md5 . my-files.md5
 
Tutto funziona come dovrebbe.
Come vedete è stato usato **! -name "$MD5_FILENAME"** per tenere fuori 
dalla mischia il file my-files.md5 (altrimenti succede qualche bordello).
Il problema però è che si decide di memorizzarlo in una directory 
esterna, spunta un fastidioso warning.
 
$ ./make-md5 . ../my-files.md5
find: warning: ‘-name’ matches against basenames only, but the given 
pattern contains a directory separator (‘/’), thus the expression will 
evaluate to false all the time.  Did you mean ‘-wholename’?
 
C'è un modo per evitare il warning?

 percorsi assoluti.
 
Non e` una buona idea questa.
Se copi il folder con i file altrove, il
checksum non torna piu`...

Cosa dovrebbe fare esattamente?
Il warning ti da anche una risposta,
ma forse non corretta.
 
Perche` escludere $MD5_FILENAME?
C'e` qualche motivo particolare?
Esiste gia`?
 
A mio avviso dovresti *prima*, come
sempre, spiegare cosa stai cercando
di fare.
Altrimenti e` un tirare ad indovinare.
 
bye,
 
-- 
 
piergiorgio

 Altrimenti e` un tirare ad indovinare.
 
$MD5_FILENAME contiene gli md5 dei file.
Ma non dovrebbe contenere **anche** l'md5 di se stesso.
Altrimenti quando faccio
 
md5sum -c my-files.md5
 
my-files.md5: NON RIUSCITO
md5sum: ATTENZIONE: 1 codice di controllo calcolato NON corrisponde
 
Il famoso fenomeno del topo che cerca di afferrare la sua coda.
 
Ecco un esperimento semplificato
 
$ touch my-files.md5
$ md5sum my-files.md5 > my-files.md5
$ md5sum -c my-files.md5
my-files.md5: NON RIUSCITO
md5sum: ATTENZIONE: 1 codice di controllo calcolato NON corrisponde


Ma se fai, per esempio:
 
md5sum * >MD5SUM
 
"*" viene espanso *prima* che MD5SUM venga
creato, quindi non appare nella lista.
 
Se hai necessita` di escluderlo, vuol dire
che stai sbagliando qualcosa.
 
bye,
 
-- 
 
piergiorgio

Il 01/07/21 21:22, Piergiorgio Sartor ha scritto:

$ tree
├── files.md5
├── root
└── sub
     └── sub
$ md5sum * > files.md5
md5sum: sub: È una directory
 
E già c'è qualcosa che non va
 
$ cat files.md5
d41d8cd98f00b204e9800998ecf8427e  files.md5
d41d8cd98f00b204e9800998ecf8427e  root
 
Manca sub/sub (sembra che le sub dir non vengano elaborate)

 Manca sub/sub (sembra che le sub dir non vengano elaborate)
 
Ho capito questo, l'esempio era per
dire che ci sono metodi per fare le
cose in maniera tale per cui non si
crea il problema del conflitto.
 
Per esempio:
 
find dir -type f -exec md5sum {} ; > MD5SUM
 
Non dovrebbe avere problemi, perche` crea
"MD5SUM" nel folder dove uno si trova, ma
cerca i file nel sub-folder "dir", quindi
non trovera` mai "MD5SUM", a meno che non
sia stato creato in precedenza (il che va
bene, perche` e` un file come gli altri).
 
La domanda e`, pero`, se uno vuole avere
il MD5SUM nel folder superiore, oppure in
quello dove si fa la ricerca.
Ovvero, se si accetta la cosa, magari
chiamando il file "dir.md5sum".
 
Una volta chiarite quali siano le soluzioni
possibili ed accettabili, si puo` vedere
come implementarle in maniera corretta.
 
Da notare che il "find" con "exec" e`
estremamente pesante, dato che fa un
"fork()" per ogni file trovato.
 
Una possibile alternativa e`:
 
find dir -type f -print0 | xargs -0 md5sum > MD5SUM
 
Questa ha per il limite della lunghezza
della linea di comando.
Se vi sono pochi file, funziona, altrimenti
ha problemi.
 
D'altro canto, usando cose come "parallel",
si possono risolvere tutti e due i problemi.
 
bye,
 
-- 
 
piergiorgio

 
 
???
.......
 

 .......
 
Se hai i folder:
 
pippo/
pluto/
paperino/
 
E fai:
 
for i in pippo pluto paperino
do
   find ... md5sum >${i}.md5
done
 
Ti trovi con:
pippo/
pippo.md5
pluto/
pluto.md5
paperino
paperino.md5
 
Senza conflitti di alcuno tipo e con
una chiara leggibilita`.
Pero` i checksum non sono nei folder,
ma un livello sopra.
Va bene cosi`?
 
Ovviamente, se c'e` un folder che si
chiama "pippo.md5/", forse c'e` un
leggerissimo problema... :-)
Ma questo e` sempre un problema...
 
bye,
 
-- 
 
piergiorgio

 ancora specificato.
 
$MD5_LIST=/etc/MD5SUM # STESSA DIR
$WORKING_DIR=/etc # STESSA DIR
 
Escludere dal **elaborazione** $MD5_LIST se si trova nella stessa 
$WORKING_DIR (/etc)
 
Cmq già detto forse non è la soluzione ottimale (ma hai convinto)

Preferirei avere tutto nella stessa dir, perchè se la devo rinominare 
non mi devo ricordare di rinominare anche il file.
Comunque non si può avere tutto :)
 

 Comunque non si può avere tutto :)
 
Non e` detto.
 
Un'altra soluzione, forse un po' piu`
complicata, e` quella di avere un file
MD5SUM in *ogni* folder, contenente
_solo_ i file di quel folder (e non dei
subfolder, se ve ne sono).
 
Ovviamente, se il folder non ha file,
ma magari solo subfolder, bisogna
tenerne conto.
 
In questo caso, il metodo di esclusione
di "find", dovrebbe funzionare, dato che
si cercano file con maxdepth 1.
 
Servono due find, pero`, qualcosa come:
 
find . -type d |
while read d
do
   pushd $d
   find . -maxdepth 1 -type f -exclude ... -exec
   popd
done
 
Alla fine uno dovrebbe avere in ogni folder
un file aggiuntivo, MD5SUM, con il checksum
dei file in quel folder.
 
Questo avrebbe anche il vantaggio che spostare
folder, mantiene il checksum.
 
Come scritto prima, pero`, se il folder non
ha file...
 
bye,
 
-- 
 
piergiorgio

Il 02/07/21 22:14, Piergiorgio Sartor ha scritto:

Grazie per l'idea, valuterò :)