Chciałbym dostosować odpowiedź przez @ user1464130, ponieważ ma problemy z obsługą spacji w nazwach plików.
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
Jeśli chcesz uruchomić polecenie na każdym pliku i wykorzystać wynik w raporcie, można użyć konstrukt while
bash. W tym przykładzie użyto md5sum
do obliczenia sumy kontrolnej dla każdego pliku.
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
Każdy $()
jest wykonywany oddzielnie i pozwala nam obliczyć sumę kontrolną dla każdego pliku. Użycie tr
ściska każde kolejne spacje w pojedynczą spację, a cut
wyodrębnia słowo w n-tej pozycji, tutaj na pierwszej pozycji. Jeśli tego nie zrobimy, otrzymamy nazwę pliku dwa razy, ponieważ md5sum
zwróci go na standardowe wyjście.
Oto przykład bez użycia porównania (nr diff
). Zauważ, że użyłem myślnika -
, aby podkreślić trzy dane wyjściowe dotyczące każdego pliku, ale może to stanowić problem, jeśli chcesz go podać do innego programu.
$ 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
rozwiązania One-liner znaleziono powiązanych Unix Stack Exchange Network pytanie: http://unix.stackexchange.com/q/62140 – tanius