我在一个目录中有很多文件:
$ ls
file000001
file000002
# ... truncated ...
file999999
我正在计算这样的文件的 md5sum,最后将其转储到文件中:
hashes=''
for file in $(ls); do
hashes+=$(md5sum $file)
hashes+="\n"
done
echo "$hashes" > hashes.txt
现在,我想在脚本执行在for
循环中时按 Ctrl + C 并将内容hashes
转储到 hashes.txt 文件中。这可能吗?
(是的,我可以在hahes.txt
每次计算每个文件的 md5sum 时附加 md5sum,但我打算这样做(如上所示)。)
请注意,上面的示例代码很糟糕。我实际上以 md5sum 为例;我正在做一些其他的事情。我的问题的目的实际上是找出如何使 Ctrl + C 工作。
顺便说一句,我不会
ls
用来获取文件列表,而是像for file in *; do
.trap break INT
在你的循环之前:我已经更正了您脚本中的一些可疑内容(
$(ls)
,"\n"
)。FWIW,这样的“非本地中断”在
mksh
or中不起作用,yash
但在bash
,和.dash
zsh
ksh93
您永远不应该将 的输出
ls
用作另一个程序的输入。它不起作用(对于任何包含可靠性或安全性概念的“工作”定义),并且永远不需要这样做,因为 shell 的通配符(即通配符扩展)可以完成您尝试做的工作误用ls
。请参阅为什么不解析ls
(以及要做什么)?.如果您必须做类似的事情,请使用
find ... -exec {} +
orfind ... -print0 | xargs -0r ...
而不是ls
- 无论文件名中的字符是什么,它们中的任何一个都将真正起作用,并且可以安全地工作。你的
for
循环应该写成:您甚至不需要
for
循环,除非您要对循环中的每个$file
循环执行其他操作。这里有一些替代方法来完成你的 for 循环所做的事情,将 的输出存储
md5sum
到一个名为 的数组hashes
中,然后打印它:使用
printf
:请注意,格式字符串中有两个
%s
由两个空格分隔。printf
这将产生与自身相同的输出md5sum
。顺便说一句,您可以看到条目如何存储在数组中
typeset -p
:shell 将 的输出拆分
md5sum
为单词(由 shell$IFS
变量的值定义),并将每个“单词”放入数组的单独元素中。使用
tee
:知道了这一点,Lasse Kliemann 的陷阱答案可以写成:
但是,您甚至不需要在这里设置陷阱。
md5sum
withtee
会做你想做的事 - 即同时填充$hashes
和hashes.txt
文件。或者,如果您不想使用数组:
这里我们使用
tee
's-a
(--append
) 选项,因为我们md5sum
在循环中运行,并且不希望每次迭代都覆盖hashes.txt
文件。注意:这将始终在字符串末尾有一个额外的空白行,
$hashes
将行数增加 1。使用数组时不会出现这种情况。