Сравнение двух директорий (знатоки линукса, помогите)

mnn
На сайте с 21.01.2008
Offline
71
mnn
1136

Есть два каталога с сотнями тысяч файлов, имеющие одинаковую структуру. Оба находятся на одном диске сервера (CentOS). Пример:

dir1/file1

dir1/subdir/file2

dir1/subdir/file3

dir2/file1

dir2/subdir/

dir2/subdir/file3

Файлы одноимённые, но не одинаковые (dir1/file1 и dir2/file1 - разные файлы).

В dir2 нет некоторых файлов, которые есть в dir1. Нужно сравнить эти два каталога, и удалить из dir1 файлы, отсутствующие в dir2 (в примере выше это файл dir1/subdir/file2, который нужно удалить).

Допускаю, что под линуксом это возможно выполнить набором команд, но самостоятельно пока не нашёл хорошего решения (разве что вариант с небольшим скриптом, который не совсем подходит из-за медленной скорости обработки - при таком количестве файлов может занять многие часы, если не сутки). Если командами не обойтись, подошёл бы и bash-скрипт, делающий это относительно быстро.

Прошу знатоков подсказать решение.

Boris A Dolgov
На сайте с 04.07.2007
Offline
215
#1

cd dir1;

find -type f | while read fname; do

[ ! -e "/path/to/dir2/$fname" ] && rm -f $fname

done

Наверно, так, но лучше сначала попробовать на кошках.

С уважением, Борис Долгов. Администрирование, дешевые лицензии ISPsystem, Parallels, cPanel, DirectAdmin, скины, SSL - ISPlicense.ru (http://www.isplicense.ru/?from=4926)
M
На сайте с 16.09.2009
Offline
278
#2

запускать rm на каждый найденный файл - замучаетесь (man xargs):


cd /path/to/dir1;
find . -type f | while read f; do
[ -e "/path/to/dir2/$f" ] || echo $f
done | xargs -n100 rm -f

а вот test, read и echo - встроенны в большинство sh-интерпретаторов (bash, например)

Абонементное сопровождение серверов (Debian) Отправить личное сообщение (), написать письмо ().
mnn
На сайте с 21.01.2008
Offline
71
mnn
#3

Boris A Dolgov, myhand,

Спасибо большое!

myhand, Т. к. ваш вариант, судя по всему, обрабатывает быстрее, воспользовался им.

Добавив аргумент -t команде xargs - получил лог удаляемых файлов (может, кому пригодится) :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий