ディレクトリのリストがあります。それらの中には名前にパターンがあります。私はこれらのパターンの配列を作成しました。
次に、結果を繰り返しfind
て各結果を各パターンと比較し、一致する場合は項目をスキップする必要があります。
これは私のコードです。
declare -a patterns=("*Api" "*Panel" "Common" "Site*" ".*")
while read folder; do
if [[ $folder == "" ]]; then continue; fi
for pattern in "${patterns[@]}"
do
echo "Checking $folder $pattern ..."
if [[ $folder == $pattern ]]; then
echo "Matched $folder $pattern"
fi
done
done <<< "$({ find /some-path -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f3 | sort })"
しかし、これはうまくいきません。たとえば、AdminApi
ディレクトリはと一致する必要があります*Api
。
静的に実行すると動作if [[ AdminApi == *Api ]]; then echo 'yes'; fi
するようになります。
しかし、配列で繰り返すと機能しません。
ここで問題は何ですか?
ベストアンサー1
zsh
代わりに使用すると、bash
これは簡単になり、より安定しています。
typeset -A patterns=(
'*Api' .
'*Panel' .
'Common' .
'Site*' .
'.*' .
)
for dir in /some/path/*(ND/:t); do
matched_patterns=( ${(k)patterns[(K)$dir]} )
if (( $#matched_patterns )) print -r -- $dir matched ${(j[, ])matched_patterns}
done
たとえば、次のようになります。
.Panel matched .*, *Panel
SiteApi matched Site*, *Api
これは以下を使用します。K
下付き文字記号連想配列の場合、拡張時にパターンが下付き文字に一致する要素としてキーを返します。そしてk
パラメータ拡張フラグ、これは返された値ではなくキーです。これを削除し、連想配列を次のように定義できます。
typeset -A patterns=(
'*Api' 'API pattern'
'*Panel' 'panel pattern'
Common Common
'Site*' 'site pattern'
'.*' 'hidden file'
)
取得するには:
.Panel matched hidden file, panel pattern
SiteApi matched site pattern, API pattern
例えば。
目的がこれらのパターンに一致するディレクトリのリストを取得することであれば、次のようになります。
patterns=( '*Api' '*Panel' Common 'Site*' '.*' )
dirnames=( /some/path/(${(j[|])~patterns})(ND/:t) )
print -rC1 -- $dirnames
または一致しない場合:
set -o extendedglob
patterns=( '*Api' '*Panel' Common 'Site*' '.*' )
dirnames=( /some/path/^(${(j[|])~patterns})(ND/:t) )
print -rC1 -- $dirnames
あなたのアプローチについては、以下をお読みください。
- 「IFS=read-r-line」を理解する
IFS= read -rd '' file
(ここでは利用できないものが必要ですが、<<<
次の質問を参照してください。) - 検索結果を繰り返すのはなぜ悪い習慣ですか?
- なぜprintfがechoより優れているのですか?
これらのどれも、それがあなたに効果がない理由を説明していません。
それは私にとって効果的です。
Checking .Panel *Api ...
Checking .Panel *Panel ...
Matched .Panel *Panel
Checking .Panel Common ...
Checking .Panel Site*, ...
Checking .Panel .* ...
Matched .Panel .*
Checking SiteApi *Api ...
Matched SiteApi *Api
Checking SiteApi *Panel ...
Checking SiteApi Common ...
Checking SiteApi Site* ...
Matched SiteApi Site*
Checking SiteApi .* ...
bash -o xtrace
bash -x
何が起こっているかを確認するには、(the same as)を使用してスクリプトを実行する必要があります。
または:
BASH_XTRACEFD=7 7> file.log bash -o xtrace ./the-script
トレース出力をファイルに保存します。
または、選択した場所に一部set -o xtrace
(無効)を追加して、+o
その追跡を有効/無効にします。