使用文件名的 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() 哈希重命名文件的脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用内容重命名 PDF 文件的批处理脚本

移动文件并使用时间戳日期重命名的脚本

git:重命名文件并更改文件内容

使用批处理脚本重命名上个月的文件

使用创建日期复制和重命名文件(批处理脚本)

npm 脚本使用 package.json 中指定的版本重命名文件