Как рекурсивно сравнивать пользователя и группу в двух разных папках? - PullRequest
0 голосов
/ 19 мая 2018

У меня есть две папки, в которых много подпапок и файлов.Например:

/wordpress/htdocs/wp-content/ 
/wordpress/htdocs2/wp-content/

Под этими двумя папками находится полная структура многих подпапок и файлов.Что я хотел бы сделать, это сравнить владение (в разрешениях второй команды) каждого файла, который существует в обеих подструктурах.Где бы ни были различия, я бы хотел, чтобы они отображались.

Результат должен выглядеть примерно так:

-rw-rw-r-- 1 user1 group1 104343 Oct 23  2017 /wordpress/htdocs/wp-content/images/comment.jpg     ||    -rw-rw-r-- 1 user1 group2 104343 May 15  2018 /wordpress/htdocs2/wp-content/images/comment.jpg

После выполнения команды, которую я ищу здесь, эти две строкибудет отображаться, потому что группа отличается для «одного и того же» файла (тот же файл, но в разных папках).

user1 group1   ||   user1 group2

ЧТО Я ПОПРОБОВАЛ:

То, что я пытался, это использоватьКоманда ниже в обеих папках и сравните выходные файлы.Однако это не работает, так как время модификации отличается для почти всех файлов.Так что это не сужает ее до действительно релевантной информации.

sudo find . -exec ls -l -all {} \; | sudo tee usergroup.txt >/dev/null

И затем я использовал эту команду для сравнения результатов:

diff -c /wordpress/htdocs/usergroup.txt /wordpress/htdocs2/usergroup.txt

Но, как сказано, результат был слишком большими не очень полезно.

  1. Как я могу решить эту проблему - лучше всего с одним вкладышем?

  2. Просто для любопытства: Как я могу сделать diff для отображения (или вывести в файл) всю строку при использовании syde-by-side?Обычно отрезает линию на определенную длину.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Возможно, очень надуманный способ решения этой проблемы:

find /wordpress/htdocs/wp-content/ a/wordpress/htdocs2/wp-content/ \
     -type f -exec stat {} --printf '%n %A\n' \; | \
     sed 's!.*/wp-content/!!' | sort | uniq -u | sed 'N;s/\n/ || /'
0 голосов
/ 19 мая 2018

Вывод ls -l включает время модификации каждого файла, которое, скорее всего, будет различным для двух файловых деревьев, поэтому diff сообщает о них.

Вы должны использовать finds -printf '…' вариант и печатать только соответствующую информацию.Это также сэкономит много ls процессов.Сделайте это дважды на обоих деревьях, и результат можно будет сравнивать более разумно.

(Кстати, find сообщает о файлах И папках, а ваш … -exec ls -al {} \; в папке будет отображать его содержимое СНОВА - идругие шумы, такие как . и ... Вы можете подавить это с помощью -d, но, как я уже сказал, вам следует избегать использования ls в целом, поскольку его основная цель заключается в списке (следовательно,(имя) содержимое каталога, а не stat отдельных файлов.

При использовании diff в параллельном режиме (-y) он должен обрезать каждую строкув некотором пункте, потому что вы попросили его отобразить второй поток красиво и аккуратно прямо рядом с первым.По умолчанию выводится не более 130 символов в строке (я полагаю), но вы можете изменить это с помощью -W.Лично я бы вообще избегал параллельного отображения, но здесь вы идете:

#!/bin/bash

diff -y -W 300 --suppress-common-lines \
    <(find /path1/wp-content -printf '%u %g %m %P\n') \
    <(find /path2/wp-content -printf '%u %g %m %P\n')

Посмотрите на man diff и man find (часть о -printf) для каких вещейВы можете напечатать о файле, как его размер.Чтобы подавить папки из вывода find, вы должны поставить -type f перед частью -printf (то есть только находить реальные файлы перед печатью).Мой пример может не полностью ответить на ваш вопрос, но вы поймете, что идея.

PS: diff обычно выводит некоторые строки context рядом с разными линиями, чтобы людям и машинам было легченайдите эти строки в исходных файлах.Фактически, в параллельном режиме diff будет отображать все по умолчанию - независимо от того, есть различия или нет.Опция --suppress-common-lines подавит это.В обычном режиме (не бок о бок) эта опция также несколько изменит формат вывода diff, включая < и > перед каждой отличающейся строкой.Может быть, этого должно быть достаточно и легко читаемым, поэтому вам вообще не нужен параллельный вариант.Просто попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...