исключить файлы сокетов во время diff -r

546
Mateusz Konieczny

diffимеет опцию --recursive( -r) для сравнения двух каталогов (файлов внутри них). Есть ли способ заставить diffигнорировать все файлы сокетов и только файлы сокетов?

Я использую, diff --brief -r --no-dereference /var/ /media/mateusz/Database/tmp/duplicity_unpack/var/чтобы проверить часть моей резервной копии, и я затоплен записями как Only in /var/lib/samba/private/msg.sock: 10001. Эти файлы являются файлами сокетов, которые Duplicity не удалось скопировать - и это не указывает на сбой резервного копирования.

Я знаю, что могу написать свою собственную обработку вывода, но это может привести к ошибкам, требует больше времени и требует от меня ведения списка файлов сокетов в файловой системе.

Обратите внимание, что пустые папки не следует игнорировать при сравнении.

0

1 ответ на вопрос

1
AFH

Я не думаю, что это возможно diffсамо по себе без изменений кода. Вам нужно будет использовать findсписок необходимых файлов, которые вы можете затем передать diffбез рекурсии:

find /var/ -type f -exec diff {} /media/mateusz/Database/tmp/duplicity_unpack{} \; 

Это находит только нормальные файлы, так как я не вижу смысла в вызовах diffс любым другим типом, поэтому нет сокетов, FIFO, каталогов, файлов устройств и т. Д.

Я попробую, но я переживаю, что он умрет от большого количества файлов ... Mateusz Konieczny 7 лет назад 0
У вас не должно возникнуть проблем: у 'diff` есть только два файла на каждый вызов, а у `find` нет известных ограничений на количество файлов, хотя я предполагаю, что должен быть какой-то предельный предел для глубины и длины путей. Вы можете перечислить каждый файл в вашей корневой файловой системе с помощью `find /`, поэтому `find / var /` не должно представлять трудностей. AFH 7 лет назад 0
У этого есть одна серьезная проблема - он не видит пустых папок. По некоторым причинам find считает файлы сокетов каталогами (`-type f -o -type d` возвращает сокеты). Mateusz Konieczny 7 лет назад 0
@MateuszKonieczny - я совсем не понимаю ваш комментарий: `find` не совпадает с сокетами` -type d` (по крайней мере, не в Ubuntu), спрашивающий хочет _exclude_ сокетов, а `diff` не обрабатывает каталоги (кроме неявно с `-r`). Чтобы найти сокеты, используйте `-type s`. AFH 7 лет назад 0
«find не совпадает с сокетами в -type d (по крайней мере, не в Ubuntu)», как я понимаю (см., например, http://superuser.com/review/suggested-edits/552975), это приводит к их перечислению Mateusz Konieczny 7 лет назад 0
@MateuszKonieczny - эта ссылка на предложенное вами изменение (которое я отклонил как неправильную) вносит те же изменения, что вы предложили в предыдущем комментарии, и не работает и не отвечает на вопрос. AFH 7 лет назад 0
Я вернулся к этой задаче и обнаружил проблему - она ​​не найдет файлы, присутствующие только в `media / mateusz / Database / tmp / duplicity_unpack / var /` и не представленные в `/ var /`. Он может быть полезен в этом случае (случай, когда файлы присутствуют только в резервной копии, не в порядке, но это довольно редкий режим отказа), но в целом он не эквивалентен. Mateusz Konieczny 7 лет назад 0
@MateuszKonieczny - You can use the search the other way round: find files in the back-up and compare with what's currently in `/var/`, though this changes the requirements of the original question. The `-exec` command will not work as above unless you `cd` to the back-up directory, but instead you can pipe the file list to a script which will strip the leading directory elements, as in `find /media/mateusz/Database/tmp/duplicity_unpack/var/ -type f|while read f; do diff "$f" "$; done`. AFH 7 лет назад 0

Похожие вопросы