如何通过bash脚本排除一个特定文件被散列

如何通过bash脚本排除一个特定文件被散列

我实际上尝试通过文件夹结构运行递归并将所有文件的 md5sum 合并到单个 md5checksums 文件中。

这是我的脚本:

/bin/bash #!/bin/bash
rm -f md5校验和
查找 -type f -exec md5sum“{}”+> md5checksums

我现在的问题是文件 md5checksums 也通过 md5sum 运行,我不知道如何防止这种情况发生。除此之外,脚本已经完成了它应该做的事情。有谁能帮我吗?

答案1

让脚本采用该名称具体文件您想要排除作为参数。

#!/bin/bash
rm -f md5checksums
find -type f ! -iname "$1" -exec md5sum "{}" + > md5checksums

使用以下方式调用脚本./script "md5checksums"

答案2

避免涉及重定向到影响命令的文件的冲突的最简单方法是使用sponge来自 moreutils:

sponge  reads  standard  input and writes it out to the specified file.
Unlike a shell redirect, sponge soaks up all its input  before  opening
the  output file. This allows constructing pipelines that read from and
write to the same file.

效果是,如果文件尚不存在,则直到管道完成才会创建。所以:

find . -type f -exec md5sum {} + | sponge md5checksums

答案3

仅使用bash

使用GLOBIGNORE

$ GLOBIGNORE='md5checksums'  ## Pattern to ignore
$ shopt -s globstar  ## Recursive globbing
$ { for i in **/*; do [ -f "$i" ] && md5sum "$i"; done ;} >md5checksums

使用extglob

$ shopt -s extglob ## Enables extended pattern matching, enabled by default
$ shopt -s globstar
$ { for i in **/!(md5checksums); do [ -f "$i" ] && md5sum "$i"; done ;} >md5checksums

使用zsh

% setopt extended_glob 
% { for i in **/^md5checksums(.); do md5sum "$i"; done  ;} >md5checksums
  • zsh使用时默认进行递归匹配**

  • ^md5checksumszsh扩展的 glob 模式,意味着匹配除md5checksums

  • glob 限定符(.)仅限制匹配常规文件。

答案4

感谢@heemayl 在他的回答中给予的一些很好的启发。

#!/bin/bash

shopt -s globstar

rm -f md5checksums

for i in **/*; do
    if [ ! -f "$i" -o "$i" = md5checksums -o "$i" = this_script.sh ]; then
        continue
    else
        md5sum "$i" >> md5checksums
    fi
done

相关内容