是否可以执行一条命令,将文件的 sha256 添加到先前创建的列表中,并且仅当它根据该列表中注册的最后日期进行了修改时才执行?
我不知道他们是否理解我的意思。我想要做的是创建一个包含所有文件以及修改日期的 sha256 列表。
因此,为了保持列表更新,我需要一个命令来比较列表中记录的更改日期与磁盘上每个文件的当前修改日期,而不是遍历所有文件(这个过程会花费大量时间和磁盘使用量)。如果检测到修改,程序将生成文件的 sha256 并将其重新注册到列表中,覆盖先前的值(仅限该文件)。
是否有一个程序可以做到这一点或有一些想法?
更新:
我需要的是一个程序,除了创建 SHA 之外,还要依次注册属于每个文件的修改日期。
例如:
文件database_of_SHA256.txt的内容:
0adca15c96d77a38aa0447fa87af9c297c *document1.txt 2018-12-03 04:12:23 dca15c96d77a9d30d2a7defad30d2a47fa *document2.txt 2018-09-09 10:19:11 77a915c9defad30d2c96d77aa0447fa87a *document3.txt 2017-01-20 17:34:04
您应该执行的代码是,我不知道这是否最合适,但您应该创建计算机上所有文件的日期和名称列表,并将它们与这些数据进行比较。如果日期不同,那么您应该生成并验证校验和。
如果校验和不匹配,则意味着文件实际上已被修改并且必须使用新信息更新列表(最好要求确认),如果用户确认他想继续,则记录列表。文件的新日期和校验和。
答案1
你可以使用 shell 脚本轻松实现这一点:
- 将文件的修改时间与列表的修改时间(或注册的时间点)进行比较
- 如果文件比列表新,则运行
sha256sum
该文件并在列表中替换
类似于
HASHCHANGED=$(stat -c '%Y' "/path/to/listfile") # Or extract the timestamp from the list
for FILE in /path/to/files/* ; do
FILECHANGED=$(stat -c '%Y' "$FILE")
if test $FILECHANGED -ge $HASHCHANGED; then
NEWHASH=$(sha256sum "$FILE")
# put the hash into your list, this depends on the list format
fi
done
编辑
从评论中我了解到,没有预定义的列表格式,正如我从 OQ 中假设的那样。这使得使用标准格式变得很自然sha256sum
。我们现在可以将上面的脚本扩展为完整的解决方案:
# Configuration
HASHFILE="/path/to/hashfile"
FILEMASK="/path/to/files/*.suffix"
HASHCHANGED=$(stat -c '%Y' "$HASHFILE")
while read FILE ; do
test -f "$FILE" || continue
FILECHANGED=$(stat -c '%Y' "$FILE")
if test $FILECHANGED -ge $HASHCHANGED; then
NEWHASH=$(sha256sum "$FILE")
cat "$HASHFILE" | grep -ve "\\s$FILE\$" > "$HASHFILE.tmp"
echo "$NEWHASH" >> "$HASHFILE.tmp"
cat "$HASHFILE.tmp" | sort -u > "$HASHFILE"
fi
done < <(eval "ls -1 $FILEMASK") #Need an eval here to allow * in mask
你应该使用sha256sum /path/to/files/*mask