如何写一个bash脚本来计算一个文件夹中所有文件的前n个字节的md5和。

问题描述 投票:0回答:1

我基本上在一个文件夹里有一些文件,我想计算这些文件的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与原始文件名连接起来?

bash pipe byte md5
1个回答
0
投票

你可以在文件中循环,就像这样。

#!/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%的时间你也需要在它周围加上引号。

  • 基本上,脚本只是循环到当前工作目录下的所有文件夹,然后运行 md5sumhead 并将输出结果保存在一个变量中,最后是 print() 用python术语和 echoprintf 在bash中。

© www.soinside.com 2019 - 2024. All rights reserved.