【问题标题】:Script to rename files using a sha1() hash of their filename使用文件名的 sha1() 哈希重命名文件的脚本
【发布时间】: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##* }"

标签: bash rename file-rename


【解决方案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
      

      【讨论】:

      • 抱歉,这个脚本似乎会删除名称中包含多个空格/点的文件。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      相关资源
      最近更新 更多