gpt4 book ai didi

linux - 多个文件类型的 Shell 脚本问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:20 25 4
gpt4 key购买 nike

我的一些文件被分成不同的目录,例如/apps/games/docs 等....在每个目录中,都有一个名为 _CHECKSUM 的子目录。在这个目录中,有一个名为 openssl.sh 的文件。

例如:

openssl sha1 /path/to/apps/*.iso | sed 's/\/.*.\///' > /path/to/apps/_CHECKSUM/sum.sha1

这会输出到 _CHECKSUM 目录中名为 sum.sha1 的文件,其内容可能如下所示:

SHA1(anApp.iso)= b398c8b175411e6174942d7b4acbc5c90473a852
SHA1(anotherApp.iso)= cc150483feed3d4b607749f31eddccefd0ba5478
SHA1(yetAnotherApp.iso)= d9682a2eca25b70dddf7a906374c27ee35614c7d

但是,有些目录包含多种文件类型,因此脚本必须如下所示:

openssl sha1 /path/to/games/*.{7z,iso} | sed 's/\/.*.\///' > /path/to/games/_CHECKSUM/sum.sha1

产生这样的东西:

SHA1(myFaveGame.7z)= b398c8b175411e6174942d7b4acbc5c90473a852
SHA1(anotherGoodGame.iso)= cc150483feed3d4b607749f31eddccefd0ba5478

我不想总是手动运行这些脚本,所以我创建了以下脚本,/path/to/scripts/openssl_recursive.sh:

#!/bin/bash
# finds every openssl.sh recursively and executes it.
IFS=$'\n'
for file in $(find /path/to -name "openssl.sh" | sort -n)
do
echo "executing $file ..."
sh $file
echo "done.";
done

这似乎适用于只存在一种文件类型的所有目录。但是,对于包含多个扩展名的 openssl.sh 脚本,会创建一个空的 sum.sha1 文件。

为什么如果我直接运行 openssl.sh,它会在 sum.sha1 中为具有多种文件类型的目录创建正确的结果,但如果我运行openssl_recursive.sh,这会导致一个空的 sum.sha1

最佳答案

如前所述here ,现代 Debian 和 Ubuntu 系统默认将 sh 符号链接(symbolic link)到 dash,这是一个较轻的版本并且缺少一些高级功能。

所以这可能不是同一个 shell,并且可能不喜欢像 *.{7z,iso} 这样的“丰富”通配符结构。你一定属于那个类别。

另一方面,bash 很乐意接受这些通配符。

因此,一个可行的解决方案是强制使用 /bin/bash 环境变量:

#!/bin/bash
# finds every openssl.sh recursively and executes it.
IFS=$'\n'
for file in $(find /path/to -name "openssl.sh" | sort -n)
do
echo "executing $file ..."
/bin/bash $file
echo "done.";
done

关于linux - 多个文件类型的 Shell 脚本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com