将文件重命名为其散列的前 N ​​个字符的单个命令

将文件重命名为其散列的前 N ​​个字符的单个命令

我使用的是 macOS Mojave。

我讨厌在将图像添加到我的网站时必须命名图像(Jekyll,对于任何关心的人)。相反,我认为合理的策略是根据文件内容生成哈希,并使用哈希的前 N ​​个字符作为文件名。当通过 Amazon S3 和 CloudFront 提供网站服务时,此策略还有助于对我的资产进行版本控制。

例子

给定一个文件somescreenshot.png,我将运行这个 TBD 命令,结果是重命名的文件8dbm2hz1.png

进步

我在这方面已经取得了进展,但目前这是一个多步骤的方法。

  1. 生成哈希值,获取前八个字符并将其发送到剪贴板。
    shasum -a 256 -b inputfile.png | head -c8 | pbcopy
  2. 重命名该文件。
    mv inputfile.png [paste from #1]

我需要使这个命令成为一个高效的管道式单步过程。

答案1

为什么不使用:

mv -- inputfile.png "$(shasum -a 256 -b inputfile.png | head -c8)"

$(shasum -a 256 -b inputfile.png | head -c8)它将把您的文件移动到哈希值的前 8 个字符的输出。

答案2

使用命令替换将哈希值保存在 shell 变量中:

file=inputfile.png
h=$(shasum -a 256 -b "$file" | head -c8)

然后您可以使用它进行重命名、打印到终端、发送到pbcopy或执行其他操作。

mv -- "$file" "$h"
echo "$h" | pbcopy
echo "'$file' renamed to '$h'"

如果您想保留文件扩展名,请使用如下内容:

newname=$h.${file##*.}
mv -- "$file" "$newname"

${var##*.}删除直到最后一个点的所有内容。)

答案3

如果你想重命名全部文件,然后使用 xargs。这是 GNU 工具的咒语,检查你的手册页看看是否存在相应的选项。

printf "%s\0" * |
    xargs -0 -I{} sh -c 'echo mv "$1" "$(shasum -a 256 -b "$1"| head -c8)"' sh {} 

这使用空字节来分隔文件名,这使得处理包含空格的文件名成为安全操作。

echo需要删除该命令才能实际移动文件。

相关内容