我使用的是 macOS Mojave。
我讨厌在将图像添加到我的网站时必须命名图像(Jekyll,对于任何关心的人)。相反,我认为合理的策略是根据文件内容生成哈希,并使用哈希的前 N 个字符作为文件名。当通过 Amazon S3 和 CloudFront 提供网站服务时,此策略还有助于对我的资产进行版本控制。
例子
给定一个文件somescreenshot.png
,我将运行这个 TBD 命令,结果是重命名的文件8dbm2hz1.png
。
进步
我在这方面已经取得了进展,但目前这是一个多步骤的方法。
- 生成哈希值,获取前八个字符并将其发送到剪贴板。
shasum -a 256 -b inputfile.png | head -c8 | pbcopy
- 重命名该文件。
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
需要删除该命令才能实际移动文件。