使用文件名的 sha1() 哈希重命名文件的脚本
Posted
技术标签:
【中文标题】使用文件名的 sha1() 哈希重命名文件的脚本【英文标题】:Script to rename files using a sha1() hash of their filename 【发布时间】:2011-06-29 20:28:32 【问题描述】:我正在建立一个网站,我想对我的图像的文件名进行哈希处理。
如何创建一个 bash 脚本文件,用旧文件名的 sha1 重命名目录中的每个文件?
我试过了:
#!/bin/bash
for file in *
do
if [ -f "$file" ];then
newfile="openssl sha1 $file"
mv "$file" $newfile"
fi
done
但这不起作用:(
编辑
根据这里的建议,我尝试了这个:
#!/bin/bash
for file in old_names/*
do
if [ -f "$file" ];then
newfile=$(openssl sha1 $file | awk 'print $2')
cp $file new_names/$newfile.png
fi
done
这确实重命名了文件,但我不确定用什么来散列文件名。扩展是否被散列?路径了吗?
信息
然后我将使用 php 的 sha1() 函数来显示图像:
echo "<img src=\"images/".sha1("$nbra-$nbrb-".SECRET_KEY).".png\" />\n";
【问题讨论】:
文件名是否包含空格字符? '没有重命名'和'没有' 为我工作。 new_names 是否存在?愚蠢的问题,我知道。 是否可以在没有文件夹或扩展名的情况下获取文件名的sha1? 关闭,但没有雪茄。使用反引号设置$newfile
,或者它们的bash 等效项$()
,记得引用$file
,以防它限制空格(newfile=$(openssl sha1 "$file")
)。最后,您似乎错过了重命名行的引用。注意你想要$newfile
的最后一个字,mv "$file" "$newfile##* "
。
【参考方案1】:
试试
newfile=$(openssl sha1 $file)
mv "$file" "$newfile##*= "
【讨论】:
【参考方案2】:试试这个:
newfile=$(openssl sha1 $file | awk 'print $2')
mv $file $newfile
【讨论】:
【参考方案3】:到目前为止答案中的代码示例和您的编辑中的文件的 内容 散列。如果你想创建的文件名是前一个文件名的哈希值,不包括路径或扩展名,那么这样做:
#!/bin/bash
for file in old_names/*
do
if [ -f "$file" ]
then
base=$file##*/
noext=$base%.*
newfile=$(printf '%s' "$noext" | openssl sha1)
cp "$file" "new_names/$newfile.png"
fi
done
【讨论】:
这很奇怪.. 似乎 php 的 sha1() 函数没有返回相同的哈希值.. @Manu:哎呀!对不起!那应该是printf '%s' "$noext"
。
在新的 ubuntu 机器上,脚本将文件重命名为“(stdin)= 1f558fe589c204f1f9d51becb749a6a10f8db6f8”。
我添加了:printf '%s' "$noext" | openssl sha1 | awk 'print $2'
来自 OP 的上述两个 cmets 很重要。这是因为较新版本的 OpenSSL 更改了输出。有关更多信息,请参阅此问题:unix.stackexchange.com/questions/42797/…【参考方案4】:
我试图做同样的事情,但这里的 sn-ps 不是 / 完全 / 我需要的,而且我是 bash 脚本的新手......对不起......最后我卡了几个将想法合并到执行我需要的脚本中 - 查看 ./pics 中的文件并将它们重命名为旧哈希,同时保持当前扩展名。我已经在一堆不同的图片上对此进行了测试,到目前为止它按预期工作。我想像我这样的另一个新手可以复制/粘贴这个,如果你的最终结果恰好和我的一样,那就很好了。感谢大家的帮助!
#!/bin/bash
for file in ./pics/*
do
newfile=$(openssl sha1 $file | awk 'print $2')
ext=$file##*.
mv "$file" "./pics/$newfile"."$ext"
done
【讨论】:
抱歉,这个脚本似乎会删除名称中包含多个空格/点的文件。非常感谢!以上是关于使用文件名的 sha1() 哈希重命名文件的脚本的主要内容,如果未能解决你的问题,请参考以下文章