私のスクリプトは次のとおりです。
- 特定のパスで利用可能なすべてのisosを検索する
- isos名をファイルのリストと比較する
- 一致するもののみを返す
簡単に言えば、コードは次のようになります。
isos_found=() # here we save the isos
isos_search=<find isos>
mapfile -t supported_isos < supported_systems # see below
for iso in "${isos_search[@]}" ; do
[[ "${supported_isos[@]}" =~ "$(basename "$iso")" ]] && isos_found+=("$iso")
done
supported_systems
以下を含むファイルはどこにありますか?
clonezilla-live-2.6.1-25-amd64.iso
debian-live-10.0.0-amd64-xfce+nonfree.iso
linuxmint-19.1-cinnamon-64bit.iso
linuxmint-19.1-xfce-32bit.iso
lubuntu-18.04-alternate-amd64.iso
supported_systems
それでは、ファイルの内容を次のように作成したいと思います。
clonezilla*
debian*
linuxmint*
lubuntu*
したがって、各バージョン/リリースをエンコードせずにリリース名のみを一致させる必要があります。
上記の()に似たコードを使用してこれは可能ですか"${supported_isos[@]}" =~ "$(basename "$iso")"
?そうでない場合は、提案を受けることができます。
答え1
supported_systems
ファイルに次のものが含まれていると仮定プレフィックス文字列(パターンではありません)
clonezilla
debian
linuxmint
lubuntu
その後、最初にすべてのISOファイルを見つけてから、特定のパターンと一致するかどうかを手動で確認するのではなく、これらの文字列を読み取ってファイルのグローバル一致に使用できます。
shopt -s dotglob nullglob globstar
isos=()
while IFS= read -r prefix; do
isos+=( ./**/"$prefix"-*.iso )
done <supported_systems
printf '%s\n' "${isos[@]}"
まず、すべてのISOファイルを検索し、それを繰り返してプレフィックスに一致するファイルを見つけるには、次のようにします。
shopt -s dotglob nullglob globstar
isos=( ./**/*.iso )
while IFS= read -r prefix; do
for iso in "${isos[@]}"; do
if [[ $iso =~ /"$prefix"-[^/]*$ ]]; then
matched_isos+=( "$iso" )
fi
done
done <supported_systems
printf '%s\n' "${matched_isos[@]}"
ここで、正規表現は、/"$prefix"-[^/]*$
与えられた$prefix
(後に)で-
始まるすべてのデフォルト名と一致します。