2012-06-18 11 views
9

Utilizzando Gnome in Linux Mint 12, ho copiato una cartella di circa 9,7 GB (contenente un albero complesso di sottocartelle) da un'unità flash NTFS a un'altra unità flash NTFS. Secondo Gnome il conteggio dei file corrisponde, ma secondo du (e altri programmi) i conteggi dei byte non corrispondono. (Ho avuto lo stesso problema copiando le cartelle in altre distribuzioni Linux e Windows XP.)Confronta 2 cartelle e trova i file con i conteggi di byte diversi

voglio solo sapere quali file non devono conta corrispondenza byte. (Non voglio confrontare il contenuto di ciascun file, perché ciò richiederebbe troppo tempo.) Qual è il modo migliore, più semplice e più veloce per trovare i file conteggio dei byte non corrispondenti?

+0

soluzioni one-liner trovati per correlata domanda Unix StackExchange: http://unix.stackexchange.com/q/62140 – tanius

risposta

3

Supponendo è necessario confrontare dir1 e dir 2, ecco i comandi della console:

cd dir1 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt 
cd dir2 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Potrebbe essere necessario modificare i parametri awk per farlo stampare la lunghezza del file e il percorso corretto.

6

Hai verificato se entrambe le partizioni hanno gli stessi attributi? (dimensione del blocco, dimensione, spazio riservato per cancellazioni o blocchi danneggiati, ecc.)

Per il vostro caso specifico, raccomanderei rsync con l'opzione -n ​​(o --dry-run). Ti dirà quali file sono diversi. Cioè:

$ rsync -I -n /source/ /target/ 

L'opzione -I è di ignorare i tempi. È possibile utilizzare lo stesso comando per rendere entrambe le directory equivalenti (timestamp, permessi, ecc.).

consultare il manuale del rsync o provare l'opzione --help per ottenere più opzioni ed esempi su come usarlo. È molto potente

10

Vorrei adattare la risposta @ utente 1464130 in quanto ha problemi a gestire gli spazi nei nomi dei file.

cd dir1 
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt 
cd dir2 
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Se si desidera avviare un comando su ogni file e utilizzare il risultato nel report, è possibile utilizzare il costrutto while Bash. Questo esempio utilizza md5sum per calcolare un checksum per ogni file.

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 

Ogni $() viene eseguita separatamente e permette di calcolare il checksum per ogni file. L'uso di tr schiaccia tutti gli spazi consecutivi in ​​un unico spazio e cut estrae la parola nella posizione n-esima, qui nella prima posizione. Se non lo facciamo, otteniamo il nome del file due volte perché lo md5sum lo restituisce sullo stdout.

Ecco un esempio senza utilizzare il confronto (no diff). Si noti che ho utilizzato un trattino - per enfatizzare i tre dati che emettiamo su ogni file, ma potrebbe essere un problema se si vuole nutrirlo con un altro programma.

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584 
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413 
+0

Come sarebbe difficile per regolare questo script per stampare un checksum per ogni file nella lista ? – mydoghasworms

+0

Ho modificato la mia risposta per fornire una soluzione. Ho appena aggiunto il checksum senza fare il diff. Vuoi diffare il checksum?Se è così, non è necessario il conteggio dei byte e differisce leggermente dalla domanda OP. Inoltre il checksum è migliore se vogliamo essere sicuri che entrambi i file siano uguali o meno. Potremmo anche aggiungere un tempo di modifica del file – lkuty

+0

Gnarly. Grazie molto. – mydoghasworms