我基本上在一个文件夹里有一些文件,我想计算这些文件的md5和。但由于这需要很长的时间,我想只需要得到每个文件的前n个字节,然后用这个作为输入来计算每个文件的md5和。
如果一个文件夹里有两个文件。
file1
file2
我想运行一个脚本,将以下内容输出到终端。
file1 md5sum(first_n_bytes_of(./file1))
file2 md5sum(first_n_bytes_of(./file2))
我找到了几条命令,似乎可以达到我想要的目的 但是管道并没有按照我的意图工作。
ls | head -c 16 | md5sum
ls -> lists all files
head -c 16 -> get first 16 bytes of inputfile
md5sum -> calculate md5sum
我只得到一个MD5值作为输出,尽管我在运行脚本的文件夹里有不止一个文件。还有一个不需要的破折号。输出结果是这样的。
6221d61df4fbe4b0f7da2d7e030ada7f -
如何将MD5sum与原始文件名连接起来?
你可以在文件中循环,就像这样。
#!/usr/bin/env bash
shopt -s nullglob
for f in *; do
chksum="$(md5sum < <(head -c16 "$f") ) $f"
echo "$chksum"
done
nullglob
bash shell选项,不会展开一个字面的glob。*
如果你运行脚本的当前目录下没有文件,那么你可以使用这个脚本。
for f in *
循环浏览当前目录下的所有文件夹。*
拓展到这一点,并 f
是变量,见 echo *
的 $( )
叫做 命令替换,它捕捉到了里面的任何命令的值,它经常被用来保存一个命令在一个变量中,就像在这个脚本中一样,在这种情况下,它是 chksum
是变数
<( )
叫做 工艺替代
要扩展一个变量,在 bash
你需要添加一个 $
前面,99.9%的时间你也需要在它周围加上引号。
基本上,脚本只是循环到当前工作目录下的所有文件夹,然后运行 md5sum
和 head
并将输出结果保存在一个变量中,最后是 print()
用python术语和 echo
或 printf
在bash中。