Discussione:
verificare il checksum dei file
(troppo vecchio per rispondere)
alex
2021-07-01 14:55:46 UTC
Permalink
+ 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.
Piergiorgio Sartor
2021-07-01 16:02:36 UTC
Permalink
Post by alex
+ 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
alex
2021-07-01 16:41:26 UTC
Permalink
Post by Piergiorgio Sartor
Post by alex
+ 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".
find . -name MD5SUM |
while read M
do
  D=$( dirname $M )
  pushd $D
  md5sum -c MD5SUM
  popd
done
bye
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 {} \; \
Post by Piergiorgio Sartor
"$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?
Piergiorgio Sartor
2021-07-01 16:59:45 UTC
Permalink
On 01/07/2021 18.41, alex wrote:
[...]
Post by alex
Si certo, oppure fare in modo che in MD5SUM vengano memorizzati solo
percorsi assoluti.
Non e` una buona idea questa.
Se copi il folder con i file altrove, il
checksum non torna piu`...
Post by alex
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"
}
$ ./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?
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
alex
2021-07-01 19:14:04 UTC
Permalink
Post by Piergiorgio Sartor
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.
$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
Piergiorgio Sartor
2021-07-01 19:22:04 UTC
Permalink
Post by alex
Post by Piergiorgio Sartor
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.
$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
alex
2021-07-02 13:47:32 UTC
Permalink
Post by Piergiorgio Sartor
Post by alex
Post by Piergiorgio Sartor
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.
$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
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,
$ 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)
Piergiorgio Sartor
2021-07-02 15:35:08 UTC
Permalink
On 02/07/2021 15.47, alex wrote:
[...]
Post by alex
$ 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)
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
alex
2021-07-02 16:28:38 UTC
Permalink
Post by Piergiorgio Sartor
[...]
Post by alex
$ 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)
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.
find dir -type f -exec md5sum {} ; > MD5SUM
Come ho già spiegato, questo non tiene MD5SUM fuori dalla mischia (se si
trova all'interno di dir), causando problemi quando faccio il checking.
In pratica per tale file non dovrebbe essere creato l'md5, perchè un
file speciale che funge da contenitore.
Post by Piergiorgio Sartor
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).
...
Post by Piergiorgio Sartor
La domanda e`, pero`, se uno vuole avere
il MD5SUM nel folder superiore, oppure in
quello dove si fa la ricerca.
L'ideale sarebbe se lo script che ho presentato all'inizio, potesse
gestire entrambe le situazioni.
In particolare nel secondo caso (LO RIPETO PER LA TERZA VOLTA),
bisognerebbe fare in modo che tale file venga ignorato.

if [ QUALCOSA ]; then
extraParam="! -name "$MD5_FILENAME""
else
extraParam=""
fi

find $extraParam ...
Post by Piergiorgio Sartor
Ovvero, se si accetta la cosa, magari
chiamando il file "dir.md5sum".
???
.......
Piergiorgio Sartor
2021-07-02 16:56:05 UTC
Permalink
On 02/07/2021 18.28, alex wrote:
[...]
Post by alex
Post by Piergiorgio Sartor
find dir -type f -exec md5sum {} ; > MD5SUM
Come ho già spiegato, questo non tiene MD5SUM fuori dalla mischia (se si
trova all'interno di dir), causando problemi quando faccio il checking.
In pratica per tale file non dovrebbe essere creato l'md5, perchè un
file speciale che funge da contenitore.
Ed invece si, MD5SUM e` fuori della mischia,
perche` *non* e` nel folder dove si fa la
ricerca per _costruzione_ della linea di comando.
dir != .

[...]
Post by alex
Post by Piergiorgio Sartor
La domanda e`, pero`, se uno vuole avere
il MD5SUM nel folder superiore, oppure in
quello dove si fa la ricerca.
L'ideale sarebbe se lo script che ho presentato all'inizio, potesse
gestire entrambe le situazioni.
No, questo non e` ideale, e` la
cosa peggiore che si possa fare
perche` crea ambiguita` e confusione.
Che succede se una volta si fa in un
modo e poi in un altro?
Post by alex
In particolare nel secondo caso (LO RIPETO PER LA TERZA VOLTA),
bisognerebbe fare in modo che tale file venga ignorato.
Non bisogna, si potrebbe, ma non bisogna.
Magari lo vuoi tu, ma non e` detto sia la
soluzione migliore.
Dipende da cosa vuoi fare, che non hai
ancora specificato.
Post by alex
if [ QUALCOSA ]; then
    extraParam="! -name "$MD5_FILENAME""
else
    extraParam=""
fi
find $extraParam ...
Questa non e` una cosa buona, come gia`
scritto prima.
Fai le cose semplici, innanzitutto, che
per farle complicate c'e` sempre tempo.
Post by alex
Post by Piergiorgio Sartor
Ovvero, se si accetta la cosa, magari
chiamando il file "dir.md5sum".
???
.......
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
alex
2021-07-02 20:05:13 UTC
Permalink
Post by Piergiorgio Sartor
[...]
Post by alex
Post by Piergiorgio Sartor
find dir -type f -exec md5sum {} ; > MD5SUM
Come ho già spiegato, questo non tiene MD5SUM fuori dalla mischia (se
si trova all'interno di dir), causando problemi quando faccio il
checking.
In pratica per tale file non dovrebbe essere creato l'md5, perchè un
file speciale che funge da contenitore.
Ed invece si, MD5SUM e` fuori della mischia,
perche` *non* e` nel folder dove si fa la
ricerca per _costruzione_ della linea di comando.
dir != .
OK scusa non avevo letto bene: in pratica MD5SUM non deve stare nella
stessa dir.
Post by Piergiorgio Sartor
[...]
Post by alex
Post by Piergiorgio Sartor
La domanda e`, pero`, se uno vuole avere
il MD5SUM nel folder superiore, oppure in
quello dove si fa la ricerca.
L'ideale sarebbe se lo script che ho presentato all'inizio, potesse
gestire entrambe le situazioni.
No, questo non e` ideale, e` la
cosa peggiore che si possa fare
perche` crea ambiguita` e confusione.
Che succede se una volta si fa in un
modo e poi in un altro?
Volevo fare una cosa ambivalente, però visto che diventa un po'
complicato, ti do ragione.
Post by Piergiorgio Sartor
Post by alex
In particolare nel secondo caso (LO RIPETO PER LA TERZA VOLTA),
bisognerebbe fare in modo che tale file venga ignorato.
Non bisogna, si potrebbe, ma non bisogna.
Magari lo vuoi tu, ma non e` detto sia la
soluzione migliore.
Dipende da cosa vuoi fare, che non hai
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)
Post by Piergiorgio Sartor
Post by alex
Post by Piergiorgio Sartor
Ovvero, se si accetta la cosa, magari
chiamando il file "dir.md5sum".
???
.......
pippo/
pluto/
paperino/
for i in pippo pluto paperino
do
  find ... md5sum >${i}.md5
done
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`?
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 :)
Piergiorgio Sartor
2021-07-02 20:14:54 UTC
Permalink
On 02/07/2021 22.05, alex wrote:
[...]
Post by alex
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 :)
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
alex
2021-07-03 14:31:58 UTC
Permalink
Post by Piergiorgio Sartor
[...]
Post by alex
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 :)
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.
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,
Grazie per l'idea, valuterò :)

Loading...