Чи можу я отримати протилежне `diff -q` - відповідність однакових файлів без друку їх вмісту


13

У мене в каталозі є декілька файлів, і я хочу перевірити, чи всі вони унікальні. Для простоти припустимо, що у мене є три файли: foo.txt, bar.txtі baz.txt. Якщо я запускаю цю петлю, я перевірю їх один проти одного:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

Для сотень файлів, з якими я хочу мати справу, це стало б досить нечитабельним; було б краще перерахувати файли, які відповідають, і тоді я зможу швидко переглянути список і переконатися, що файли відповідають лише собі. Зі сторінки, я б подумав, що -sваріант виконає це:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... однак, він також видає весь вміст будь-яких файлів, які відрізняються. Чи є якийсь спосіб придушити таку поведінку, тому я лише отримую поведінку вище?

Як варіант, чи є якийсь інший інструмент, який може досягти цього ?

Відповіді:


6

Якщо ви просто хочете перевірити, чи два файли однакові чи ні, використовуйте cmp. Щоб отримати вихід лише для однакових файлів, ви можете використовувати

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff намагається скласти короткий, зрозумілий для людини список відмінностей, і це може зайняти досить багато часу, тому уникайте накладних витрат, якщо вам це не потрібно.


12

Для цього слід зробити фокус:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

де dir1і dir2ваші два каталоги.

Якщо ви хочете друкувати лише відповідні каталоги з dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

І також, якщо ви хочете друкувати лише відповідні каталоги з dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

Це саме те, що я шукав, дякую!
Джошуа Соало

Використовуйте diff -qrsпри порівнянні великих файлів (тихо пригнічує різниці друку)
marcovtwout

4

Швидкий інструмент , написаний для цієї мети є fdupes (вона доступна в пакеті РЕПО в Fedora і Ubuntu і ...)

Використання:

fdupes -r dir1 dir2

2

Якщо вам потрібно знайти однакові файли у списку, спершу відсортуйте їх за розміром, наприклад, за

ls -S

то для кожної групи файлів однакового розміру запустіть md5sumна них, щоб легко побачити, які їм ідентичні.

Для великих файлів може бути швидше спочатку перевірити лише коротку частину всього файлу:

dd if=file bs=512 count=1 | md5sum

а потім виконати повну контрольну суму лише на підозрілих файлах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.