带有忽略 Emacs-lisp 子目录选项的异步复制目录?

Asynchronous copy-directory with the option to ignore subdirectory in Emacs-lisp?

几个月来我一直在使用 异步复制目录问题的答案中的代码,但有时我需要忽略一个或多个子目录。有没有简单的方法通过稍微修改代码来做到这一点?

我尝试使用选择性目录复制:来自 here 的 SDC 包,但是当文件或文件夹已经存在时它会停止。

这是我现在使用的代码:

(async-start
    `(lambda()
        (copy-directory ,"~/Documents/data/" ,"~/Dropbox/data_backup/" t t t)
        ,"~/Documents/data/")
    (lambda(return-path)
        (message "Upload '%s' finished" return-path)))

~/Documents/data中有一个子目录,有时我希望忽略它,因为它大于阈值。

copy-directory 递归调用自身。您可以使用 cl-flet 在本地重新定义它,同时保持原始定义。您也可以通过建议来做到这一点(实际上这种 cl-flet 技术似乎违反了建议),但是它实际上是在全局范围内重新定义该功能,您需要使用例如控制它变量。

(defun jpk/copy-directory (directory newname &optional keep-time parents copy-contents)
  (cl-letf (((symbol-function 'orig/copy-directory) (symbol-function 'copy-directory))
            ((symbol-function 'copy-directory)
             (lambda (directory newname &optional keep-time parents copy-contents)
               (if (string= directory "/path/to/foo")
                   (message "skipping: %s" directory)
                 (orig/copy-directory directory newname keep-time parents copy-contents)))))
    (copy-directory directory newname keep-time parents copy-contents)))

更详细:将原始函数存储到 orig/copy-directory,将函数 copy-directory 替换为仅当目录名称与某些字符串不匹配时才调用 orig/copy-directory 的 lambda,然后调用 copy-directory 的新定义。对 copy-directory 的递归调用也使用新定义。所有这些都包含在 jpk/copy-directory 中。为了使其更加灵活,您可以向 jpk/copy-directory 添加一个谓词参数,这样测试就不会被硬编码。