Docker 通过shell脚本查找隐藏和非隐藏文件
我编写了一个小shell脚本,它在容器的启动过程中创建了几个扩展名为.dist但没有扩展名的文件的副本Docker 通过shell脚本查找隐藏和非隐藏文件,docker,sh,alpine,Docker,Sh,Alpine,我编写了一个小shell脚本,它在容器的启动过程中创建了几个扩展名为.dist但没有扩展名的文件的副本 #! /bin/sh path=$(pwd) echo $path shopt -s dotglob for file in ./*.dist; do filename=$(basename -- "$file") #echo $filename name="$path/${filename%.*}" #echo $name if [ -a "$n
#! /bin/sh
path=$(pwd)
echo $path
shopt -s dotglob
for file in ./*.dist; do
filename=$(basename -- "$file")
#echo $filename
name="$path/${filename%.*}"
#echo $name
if [ -a "$name" ]; then
echo "$name already exists."
else
echo "copy $file to $name"
cp -f "$file" "$name";
fi
done;
shopt -u dotglob
在本地,它在我的MacOs上运行得很好,但在容器中,Alpine使用的不是bash而是sh作为shell,它不知道“shopt”命令
当您使用bash时,“shopt”是我可以安装的还是仅仅是一个可用的命令
如果shopt不可用,我如何更改我的脚本,即for循环查找隐藏文件(前面有点)以及普通文件
应找到以下两个示例:
phpstan.neon.dist
.php_cs.dist具有特定的规则,注意:
如果文件名以(“.
)开头,则应使用a作为模式的第一个字符或紧跟在字符之后,显式匹配。前导不得与[…]匹配。修改本规则:
dotglob
:如果设置了,Bash会在文件扩展的结果中包含以“.”开头的文件名。即使设置了dotglob
,文件名“”和“。
”也必须始终明确匹配
因此特定于Bash的dotglob
*
模式几乎类似于POSIX*
*
,除了几个特殊的情况:POSIX*
将匹配当前目录和父目录
和。
,如果没有非隐藏文件名,那么您将在输出中获得一个文本*
“文件,可能隐藏在.dist
中结尾”的规则与当前目录完全不匹配。通过使用test-f
仅处理已知存在的文件,可以防止*.dist
不匹配,或防止存在真正的文件(字面上称为*.dist
)
用于*.dist.*.dist中的文件;做
如果测试-f“$file”;然后
...
fi
完成
您是否尝试将ls*.dist
与ls-a*.dist
进行比较?您可以将其与diff
进行比较,准确程度如何?我的for condition的语法是什么?如果你真的想要bash(而不是修复在Busybox中运行的脚本),你是否尝试过apk add bash
?不,我肯定更喜欢在sh中运行的脚本。添加bash只是最后的解决方案。对于文件in./*.dist.*.dist
?