Различие между двумя каталогами с одинаковыми размерами файлов, но разными именами файлов - PullRequest
0 голосов
/ 13 марта 2019

У меня есть две директории, скажем, D1 и D2.Они оба содержат одинаковое количество файлов одинакового размера, но с разными именами.Скажем, D1 содержит f1, f2 & f3, а D2 содержит ff1, ff2 & ff3.Я хочу сделать различие между f1 & ff1, f2 & ff2 и f3 & ff3 в этом сценарии.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Предполагая, что:

  1. что соответствующие файлы имеют одинаковый размер
  2. нет двух файлов в одном каталоге одинакового размера
  3. имена файлов просты (без забавных символов, таких как пробелы или переводы строк в именах файлов)

Тогда вы можете сделать:

ls -1S d1/* d2/* | while read f1; read f2; do echo "diff $f1 vs $f2"; diff "$f1" "$f2"; done

Почему это работает:

  • ls -1S d1/* d2/*: создает список всех файлов в d1 и d2, отсортированных по размеру. Это означает список, в котором два последовательных файла имеют одинаковый размер.
  • while read f1; read f2; do: читает две записи.

В простом тесте это дало мне следующий вывод:

diff d1/f3 d2/ff1
1c1
< 11
---
> 12
diff d1/f2 d2/ff2
diff d1/f1 d2/ff3

Здесь f1 и ff3 были пустыми, f2 и ff2 идентичны с 1 символом там, а f3 и ff1 отличаются с 2 символами.

0 голосов
/ 13 марта 2019

Tricky. Предполагая, что вы уверены, что хотите различать файлы с разными именами, но одинаковыми размерами - это решение будет явно показывать неправильные результаты, если у вас более одного файла с одинаковым размером в исходных (D1) и целевых (D2) каталогах .

Попробуйте сначала получить два списка:

eval "declare -gA sizes1=( $(find D1 -printf "[%s]=%p\n") )"
eval "declare -gA sizes2=( $(find D2 -printf "[%s]=%p\n") )"

Теперь итерируйте их и выполните diff:

for item in ${!sizes1[@]} ; do 
    echo === testing ${sizes1[$item]} against ${sizes2[$item]} =====; 
    diff ${sizes1[$item]} ${sizes2[$item]}; 
done

Надеюсь, что это поможет, и направит вас в нужном вам направлении.

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