Docker 通过shell脚本查找隐藏和非隐藏文件

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

我编写了一个小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 "$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