디렉터리가 배열 변수와 일치하는지 여부

디렉터리가 배열 변수와 일치하는지 여부

디렉토리에 파일 확장자 배열이 포함되어 있는지 확인하고 싶습니다. 우분투에서 Bash를 사용하고 있습니다.

그것은 다음과 같습니다:

files=$(ls $1/*)

extensions=$( txt pdf doc docx)

if [[ -e $files[@] contains $extenstions[@] ]] && echo "document exists" || 

echo "nothing found"

답변1

이 시도:

shopt -s nullglob
files=(*.txt *.pdf *.doc *.docx)
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

또는

shopt -s nullglob extglob
files=(*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

모든 하위 디렉터리에도 파일이 필요한 경우:

shopt -s nullglob extglob globstar
files=(**/*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

에서 man bash:

nullglob: 설정된 경우 bash는 파일과 일치하지 않는 패턴이 자신이 아닌 빈 문자열로 확장되도록 허용합니다.

extglob: 설정하면 확장된 패턴 일치 기능이 활성화됩니다. 아래를 참조하세요.

globstar: 설정된 경우 경로 이름 확장 컨텍스트에 사용된 패턴 **은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다.

확장된 와일드카드:

?(pattern-list): 주어진 패턴이 0개 또는 1개 발생하는 것과 일치합니다.

*(pattern-list): 주어진 패턴의 0개 이상의 발생과 일치합니다.

+(pattern-list): 주어진 패턴과 하나 이상 일치합니다.

@(pattern-list): 주어진 패턴 중 하나와 일치합니다.

!(pattern-list): 주어진 패턴 중 하나를 제외한 모든 것과 일치합니다.

답변2

디렉토리에서 모든 파일을 찾으십시오.

 #find all types of files
 PDFS=`find . -type f | grep pdf |wc -l`
 TXTS=`find . -type f | grep txt |wc -l`
 DOCS=`find . -type f | grep doc |wc -l`
 DOCXS=`find . -type f | grep docx |wc -l`
 SUM=$(( PDFS + TXTS + DOCS + DOCXS ))
 if [[ $SUM=0 ]] ; then 
    echo "not found"
 else
    echo "Some document found"

PDF 유형의 문서 수를 찾는 것과 같은 다른 유사한 작업을 수행할 수 있습니다.

grep -EOR(|) 조건을 사용하여 하나의 표현식만 작성하여 모든 유형의 파일을 계산할 수도 있습니다 . 이렇게 하면 단 하나의 명령으로 줄어듭니다.

또 다른 간단한 계산 옵션:

   numberoffiles=`find -name "*.pdf" -o -name "*.doc" -o name "*.txt"`

답변3

set   --                             ### init arg array
for e in txt pdf doc docx            ### outer loop for convenience
do    for  f in ./*."$e"             ### inner loop for files
      do   case  $f in (./\*"$e")    ### verify at least one match
           [ -e "$f" ];; esac &&     ### double-verify
           set  "$f" "$@"            ### prepend file to array
done; done                           ### double-done

$1완료되면 모든 파일은 및 $2등에 위치하게 됩니다 . 전체 그룹은 단일 문자열(예: )로 참조되거나 "$*"별도 문자열 목록 "$@"(예: ) 으로 참조될 수 있습니다. 에서 카운트를 얻을 수 있습니다 "$#". 다음을 사용하여 arg 배열 멤버를 조작할 수 있습니다.set (위와 같이)그렇지 않으면 shift.

답변4

확장 목록을 다음으로 전환하세요.@(…|…) 와일드카드 패턴.

shopt -s extglob nullglob
pattern='@('
for x in "${extensions[@]}"; do
  x=${x//"\\"//"\\\\"}; x=${x//"?"//"\\?"}; x=${x//"*"//"\\*"}; x=${x//"["//"\\["}
  pattern="$pattern$x|"
done
pattern="${pattern%\|})"
matches=(*.$pattern)
if ((${#matches[$@]})); then
  echo "There are matches"
fi

또는(특히 하위 디렉터리에서 파일을 반복적으로 찾으려는 경우) find.

name_patterns=("(")
for x in "${extensions[@]}"; do
  x=${x//"\\"//"\\\\"}; x=${x//"?"//"\\?"}; x=${x//"*"//"\\*"}; x=${x//"["//"\\["}
  name_patterns+=(-name "*.$x" -o)
done
name_patterns[${#name_patterns[@]}]=")"
if [ -n "$(find dir "${name_patterns[@]}" | head -n 1)" ]; then
  echo "There are matches"
fi

또는 zsh를 사용하십시오.

matches=(*.$^extensions(NY1))
if ((#matches)); then
  echo "There are matches"
fi

관련 정보