![如何通过bash脚本排除一个特定文件被散列](https://linux22.com/image/989029/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87bash%E8%84%9A%E6%9C%AC%E6%8E%92%E9%99%A4%E4%B8%80%E4%B8%AA%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E8%A2%AB%E6%95%A3%E5%88%97.png)
我实际上尝试通过文件夹结构运行递归并将所有文件的 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
使用时默认进行递归匹配**
^md5checksums
是zsh
扩展的 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