我开始使用组织模式规划我的任务GTD风格的系统。将每个 org 文件放在 a 的目录中Dropbox文件夹中,我运行 emacs 从三个不同的本地计算机编辑/管理这些文件:Cygwin、Mac OS X 和 Debian。因为我也用移动组织要从我的 iPad 访问这些组织文件,checksums.dat
文件必须在进行任何更改时保持最新。这可以通过运行来完成md5sum *.org > checksums.dat
。
问题是有三命令的不同命令md5sum
:md5sum.exe
在 Cygwin、md5
Mac OS X 和md5sum
Debian 中。最理想的情况是一个 makefile,存储在 Dropbox 文件夹中,检测当前机器中可用的命令并运行该命令来执行 md5 校验和操作。
答案1
生成校验和的可能命令
不幸的是,没有标准实用程序来生成加密校验和。有一个生成 CRC 的标准实用程序:cksum
;这可能足以满足您检测非敌对环境中的变化的目的。
我建议使用 SHA1 而不是 MD5。拥有 MD5 实用程序但没有 SHA1 的系统并不多,如果您要使用加密校验和,您不妨使用一种没有已知方法的算法来查找冲突(假设您还检查大小)。
一种非标准但常见且可以计算摘要的工具是开放式SSL。它适用于 Cygwin、Debian 和 OSX,但不幸的是不是 OSX 上默认安装的一部分。
openssl dgst -sha1
在 OSX 10.6 上,有一个shasum
实用程序,它也存在于 Debian 中(它是软件包的一部分perl
),我相信也存在于 Cygwin 中。这是一个 Perl 脚本。大多数 unix 系统都安装了 Perl,因此如果您担心此脚本不是随处可用,您可以将该脚本与您的 makefile 捆绑在一起。
为您的系统选择正确的命令
好吧,假设您确实找不到一个在任何地方都适用的命令。
在壳里
使用type
内置命令查看命令是否可用。
sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org
GNU 使
您可以使用shell
功能在加载 makefile 时运行 shell 片段并将输出存储在变量中。
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
便携式 (POSIX) 品牌
您只能在规则中运行 shell 命令,因此计算校验和的每个规则都必须包含查找代码。您可以将代码片段放入变量中。请记住,规则中的单独行是独立评估的。还要记住,$
要传递到 shell 的符号需要转义为$$
。
determine_sum = \
sum=; \
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
done; \
if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
checksums.dat: FORCE
$(determine_sum); \
$$sum *.org
答案2
这是一种黑客行为,但您可以测试每个是否存在,如果存在则执行它们:
[ -x "`which md5 2>/dev/null`" ] && md5 newfile >>sums
[ -x "`which md5sum 2>/dev/null`" ] && md5sum newfile >>sums
我非常确定 cygwin 可以识别md5sum
不带 的命令(包括 ).exe
,但如果需要的话也可以包含它。
答案3
任何一个 GNU 自动工具(如评论中所述),或者也CMake是一个选项。
GNU 自动工具是更传统的方法,但是(也许仅代表我自己)我认为人们对于最初使用它们建立项目的前景并不太兴奋。无论如何,这都是一个学习曲线。 CMake 是较新的事物,也许不太常见(并且仍然有一个学习曲线)。它有自己的语法,并为您的平台生成 makefile。 CMake 确实具有明显的优势,即不那么不以 x 为中心;它也可以在 unix、windows 和 mac 上可靠地工作(例如,它可以生成 msvc 项目,而不是 makefile。)
编辑:当然,既然建议了“makefiles”,这个答案就符合这个假设。但也许一个 Python 脚本或(喘气)一个简单的 Java 程序更适合这项任务;脚本/编程语言会跨平台执行相同的操作。
答案4
由于您正在运行 emacs,因此您可以使用 emacs 本身来计算校验和:http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html。