带有忽略 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
添加一个谓词参数,这样测试就不会被硬编码。
几个月来我一直在使用
我尝试使用选择性目录复制:来自 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
添加一个谓词参数,这样测试就不会被硬编码。