2014-02-18 3 views
2

Кто-нибудь знает, как перечислить файлы, которые существуют в одной удаленной папке, а не в другой удаленной папке. У меня есть два сервера (например, Server1 и Server2) с аналогичной структурой папок, где я занимаюсь Rsync. Однако папка назначения имеет больше файлов, чем источник, поскольку некоторые из файлов были удалены. Сейчас я пытаюсь найти способ, чтобы выяснить, какие файлы являются новыми в Сервера2 с помощью diff между сервером 1 и сервером 2.Разница между двумя удаленными папками через SSH

Я могу взять различия между двумя локальными папками непосредственно с помощью следующей команды:

diff /home/www/images/test_images /var/www/site/images/test_images 

Но мне было интересно, можно ли разграничить папки между двумя удаленными серверами с помощью ssh. Как это?

diff [email protected]:/home/www/images/test_images [email protected]:/var/www/site/images/test_images 

Скажем SSH конфигурации сервера 1 и сервера 2 являются следующие:

Сервер 1

IP: images.server1.com 
User: ubuntu1 
Password: pa$$word1 
Images Path: /home/www/images/test_images 

Сервер 2

IP: images.server2.com 
User: ubuntu2 
Password: pa$$word2 
Images Path: /var/www/site/images/test_images 

В надежде на любой он lp для решения этой проблемы. Благодарю.

+0

возможно :-) http://malcontentcomics.com/systemsboy/2006/07/send-remote-commands-via-ssh.html – Leo

ответ

5

Попробуйте эту команду:

diff -B <(sshpass -p 'pa$$word1' ssh [email protected] "find /home/www/images/test_images -type f | sed 's/\/home\/www\/images\/test_images\///g'" | sort -n) <(sshpass -p 'pa$$word2' ssh [email protected] "find /var/www/site/images/test_images -type f | sed 's/\/var\/www\/site\/images\/test_images\///g'" | sort -n) | grep ">" | awk '{print $2}' 

Объяснение:

Вы можете использовать diff -B <() <() для принятия различий между двумя потоками. Команда сначала использует sshpass для ssh на два сервера без необходимости вводить ваши пароли в интерактивном режиме.

Каждый параметр diff -B использует find команду рекурсивно список всех изображений в указанном каталоге и использует sed для удаления корневой путь к файлам (потому что они различны для двух серверов - и заставить его работать для команды diff); и команду sort.

Поскольку выход из diff команды возвращает либо > или <, grep используется, чтобы отфильтровать только переформатирование: с вашего сервера 2. Последнее, awk печатает только второй столбец (удаляет > столбца из выходных).

ПРИМЕЧАНИЕ: Сначала необходимо установить sshpass. Используйте apt-get, чтобы установить его следующим образом:

sudo apt-get install sshpass 

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

+1

Большое спасибо за объяснение. Вы решили мою проблему, я просто добавил nohup 'you command' & disown для запуска в фоновом режиме, поскольку это занимало много времени, потому что я тестировал более 1 000 000 изображений ... отлично !!! – Sergio

Смежные вопросы