使用按时间排序的列表,如何为每个文件插入校验和?

使用按时间排序的列表,如何为每个文件插入校验和?

时间戳示例:
20211018_14:54:54.0596445490_Mon

下面的 Ubuntu 20.04.3 命令有效,显示

  • 目录和
  • 文件和
  • 隐藏文件:
    权限、Time_Day、f 或 d、路径/文件名
find . -printf "%M %TY%Tm%Td_%TT_%Ta %Y%p\n" |sort -k2 ;

按时间排序,第 2 列。
最新文件在底部,4 个示例:

-rw-r--r-- 20211001_13:02:16.0000000000_Fri f./Bash/awkCommnads.txt   
-rw-r--r-- 20211013_06:22:12.0000000000_Wed f./.HiddenFile_1.txt   
drwxr-xr-x 20211018_14:51:42.1712136500_Mon d.   
drwxr-xr-x 20211018_14:54:54.0596445490_Mon d./Bash   

换句话说,
如何获取
按时间排序的上述列表左侧每个文件的 32 字节 md5sum 校验和?
示例:

123456789T123456789w123456789Y12 -rw-r--r-- 20211001_13:02:16.0000000000_Fri f./Bash/awkCommnads.txt   

一旦 md5 起作用,然后 sha512sum。

测试提示:

setterm -linewrap off ; find . -printf "%M %TY%Tm%Td_%TT_%Ta %Y%p\n" |sort -k2 ; tput smam ;  

为了测试,每条记录一行,不换行:

setterm -linewrap off ; Commands... ; tput smam ;

tput smam ; = 换行

再次,
使用按时间排序的列表,如何为每个文件插入校验和?

--


答案1

您需要md5sum为每个文件(或者更确切地说是每个常规文件find)。您可以使用运行任意命令-exec。问题是find . -type f -exec md5sum {} \;还会打印(即md5sum会打印)路径名和尾随换行符,有时还会打印前导反斜杠。您需要在继续 之前删除它们-printf

一种直接的方法是使用cut和。要在内部tr执行,md5sum … | cut … | tr …find你需要一个 shell。对每个文件执行许多进程的成本很高。您不能使用,-exec … {} +因为您需要md5sum-printf轮流执行。如果我们设法让 shell 完成cut和的工作,我们将节省一些进程tr

对于单个文件(例如/etc/fstab),您可以按照所需格式打印其 md5sum,仍然不需要cuttr,如下所示:

sh -c '
   exec 2>/dev/null
   sum="$(md5sum <"$1")" || sum="????????????????????????????????"
   printf "%s " "${sum%% *}"
' sh /etc/fstab

考虑到性能,我们希望printf这是您的内置命令sh。上述命令旨在在md5sum失败时显示问号。有用的链接:

现在让我们将命令构建到你的 中find。像这样:

find . -exec sh -c '
   exec 2>/dev/null
   sum="$(md5sum <"$1")" || sum="????????????????????????????????"
   printf "%s " "${sum%% *}"
' find-sh {} \; -printf '%M %TY%Tm%Td_%TT_%Ta %Y%p\n' | sort -k3

笔记:

  • sort -k2成为了sort -k3

  • 该命令将尝试md5sum针对任何类型的文件运行。例如,针对目录md5sum将失败,您将得到问号,这是可以接受的。另一方面,对于 fifomd5sum可能会无休止地等待数据,这是您不想要的。考虑限制find为常规文件(只需添加-type f作为第一个测试)或修复命令,以便我们的-exec操作仅针对常规文件:

    find . \( -type f -exec sh -c '
        exec 2>/dev/null
        sum="$(md5sum <"$1")" || sum="????????????????????????????????"
        printf "%s " "${sum%% *}"
    ' find-sh {} \; -o -printf '-------------------------------- ' \) \
    -printf '%M %TY%Tm%Td_%TT_%Ta %Y%p\n' | sort -k3
    

    ?或字符的序列-与任何 md5sum 的长度相同,因此它们可以很好地对齐。

  • 路径名中的换行符会使你感到困惑sort。如果可以,请使用以空字符结尾的字符串。例如,sort在我的 Kubuntu 中使用 GNU:

    find … -printf '…\0' | sort -z … | tr '\0' '\n'
    

相关内容