Сравнивая две директории, какая из них имеет самую новую версию каждого файла? - PullRequest
1 голос
/ 19 мая 2019

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

У меня есть действующий каталог (Dir1) и каталог разработки (Dir2) с одинаковыми именами файлов.Содержимое может отличаться или не различаться, и то же самое относится и к датам.

Используя командную строку PHP или linux, мне нужно получить рекурсивный список того, в каком каталоге находится самая новая версия каждого файла.Я не могу использовать rsync из-за своей среды размещения.

Это даст хороший список последних измененных файлов для одного каталога:

find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n20

Падениедля этого я должен вручную разделить вывод.

Это хорошо, но он не показывает, какие файлы новее:

diff --brief -rq www/dashboard dev.efit.health/dashboard

Есть лиспособ использовать diff и выводить, какие файлы новее?

Если нет, то может кто-нибудь указать мне правильное направление?

1 Ответ

2 голосов
/ 20 мая 2019

Учитывая две иерархии файлов с корнями в dir1 и dir2, где каждая иерархия содержит точно такой же набор имен файлов, вы можете использовать вариант вашей команды поиска, чтобы вывести список более новой для каждой пары файлов.

Этот код будет печатать один файл случайным образом, если их временные метки совпадают, но вы можете выбрать другое поведение с помощью соответствующей фильтрации.

shownewer(){
    find "$1"/ "$2"/ -type f -printf '%T@   :%p\n' |\
    sort -r |\
    sort -t/ -s -k2,2 |\
    sed 's/^[0-9.]*   ://;n;d'
}
  • find печатает файлы с отметкой времени (доли секунды с начала эпохи)
  • первые sort заказы по метке времени в обратном порядке
  • второй sort игнорирует каталог верхнего уровня и сортирует по оставшемуся разделу пути
  • sed печатает первый файл каждой пары

Предупреждение: Вывод может быть полностью неверным, если папки не содержат точно одного и того же набора файлов. Одно удаление может действительно испортить ситуацию.

Тест с чем-то вроде:

# create test data
$ mkdir dir1 dir2
$ touch {dir1,dir2}/{1,2,3,4,5}
$ sleep 1
$ touch dir1/2 dir2/{3,5}

$ shownewer dir1 dir2
dir2/1
dir1/2
dir2/3
dir2/4
dir2/5
...