디렉토리 목록이 있습니다. 그들 중 일부는 이름에 패턴이 있습니다. 나는 이러한 패턴에 대한 배열을 만들었습니다.
그런 다음 결과를 반복 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
해당 추적을 활성화/비활성화하세요.