Сравнение каталогов в Emacs

cd /tmp/backup
find . -name '*.php' | cpio -pmud /home/mysite/public_html
15
11.02.2012, 22:00
4 ответа

Я использовал M-x dired-compare-directories, но существует также EdiffTrees, который мог бы обслуживать Вас лучше в ситуации, которую Вы описываете.

5
27.01.2020, 19:50

Мне тоже понадобилась эта функция, и я придумал следующее. Функция ediff-каталогов-рекурсивная работает так же, как ediff-каталоги , но рекурсивно переходит в подкаталоги.

Магия заключается в временной замене встроенных файлов-каталогов на самодельный рекурсивный-каталог-файлов перед вызовом ediff-каталогов .

(eval
 (let ((directory-files-original (symbol-function 'directory-files)))
   `(defun directory-files-recursive (directory &optional full match nosort)
      "Like `directory-files' but recurses into subdirectories. Does not follow symbolic links."
      (let* ((prefix (or (and full "") directory))
         dirs
         files)
    (mapc (lambda (p)
        (let ((fullname (if full p (concat prefix "/" p))))
          (when (and (file-directory-p fullname)
                 (null (or (string-match "\\(^\\|/\\).$" p)
                       (string-match "\\(^\\|/\\)..$" p)
                       (file-symlink-p fullname))))
            (setq dirs (cons p dirs)))))
          (funcall ,directory-files-original directory full nil nosort))
    (setq dirs (nreverse dirs))
    (mapc (lambda (p)
        (when (null (file-directory-p (if full p (concat prefix "/" p))))
          (setq files (cons p files))))
          (funcall ,directory-files-original directory full match nosort))
    (setq files (nreverse files))
    (mapc (lambda (d)
        (setq files
              (append files
                  (if full
                  (apply 'directory-files-recursive (list d full match nosort))
                (mapcar (lambda (n)
                      (concat d "/" n))
                    (apply 'directory-files-recursive (list (concat prefix "/" d) full match nosort)))))))
          dirs)
    files))))

(eval
 `(defun ediff-directories-recursive (dir1 dir2 regexp)
    "Like `ediff-directories' but recurses into sub-directories. Does not follow symbolic links."
    ,(interactive-form (symbol-function 'ediff-directories))
    (let ((directory-files-original (symbol-function 'directory-files)))
      (unwind-protect
      (progn
        (fset 'directory-files (symbol-function 'directory-files-recursive))
        (ediff-directories dir1 dir2 regexp)
        (fset 'directory-files directory-files-original))))))
3
27.01.2020, 19:50

Существуетztreeпакет от Melpa, который поддерживает рекурсивное сравнение дерева каталогов:M-x ztree-diffс использованием утилит GNU diffдля сравнения соответствующих файлов.

Если вы используете use-package, то для установки и настройки пакета ztreeдобавьте в свой.emacs:

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
6
27.01.2020, 19:50

Хотел добавить к рекомендации ztreeвыше; Зтри это круто. Для тех, кто в недоумении, вот скриншот..enter image description here

0
26.05.2021, 13:14

Теги

Похожие вопросы