【问题标题】:How to write a bash script to calculate the md5 sum of the first n bytes of all files of a folder如何编写一个bash脚本来计算一个文件夹的所有文件的前n个字节的md5和
【发布时间】:2020-05-18 19:43:06
【问题描述】:

我基本上在要计算 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】:

    你可以遍历文件,比如。

    #!/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 * 的输出

    • $( ) 被称为Command Substitution,它捕获内部任何命令的值,它通常用于将命令保存在此脚本中的变量中,在这种情况下,chksum 是变量

    • &lt;( ) 被称为Process Substitution

    • 1234563 1234563在 python 术语中,echoprintf 在 bash 中。

    【讨论】:

    • 这个命令做我想做的,但我是如何工作的?我是使用 bash 脚本的初学者。感谢您提供有关如何分解/阅读此命令的建议:-)
    • 我想我已将问题标记为已回答? Upvoting 已记录,但由于我在 stackoverflow 上的声誉而无法看到。感谢您回答和解释我的问题!
    • 如果文件包含单引号字符,则此脚本将失败,例如file'name.txt 有很多错误:xargs: unmatched single quote;默认情况下,引号对 xargs 是特殊的,除非您使用 -0 选项。如何修复脚本?
    • 我没有在这个答案中使用xargs,因为 xargs 默认情况下被破坏了,我该如何修复我什至没有在这个脚本中使用的东西?我不知道/看到脚本,你要我修复它?您的帖子中没有关于 xargs 的内容...
    • 我使用了这个脚本。我不知道我是否在我的系统中搞砸了一些东西,但是如果我运行这个脚本并且我有一个文件名中有一个单引号的文件,那么终端会收到很多这些错误消息。你试过这个案例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多