여러 패턴이 포함된 find 명령은 출력을 반환하지 않습니다.

여러 패턴이 포함된 find 명령은 출력을 반환하지 않습니다.
#!/bin/bash
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

find $path -type f $open -name $pat $close

위 코드는 find의 출력을 표시하지 않습니다. 돕다

답변1

pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close

이는 원하는 효과를 갖지 않습니다. 변수의 따옴표는 pat따옴표로 처리되지 않고 리터럴 문자로 처리됩니다. 확장 후에는 단어 $pat분할이 수행되어 단어 '*.ab', -o및 작은따옴표가 그대로 유지됩니다. 따라서 파일 이름에 작은따옴표가 포함되어 있지 않으면 일치하지 않습니다.-name'*.bc'

path=path

이는 변수를 path리터럴 string 으로 설정 path하지만 이는 단지 자리 표시자일 뿐이라고 생각합니다.

open="\("
close="\)"

이는 변수에 리터럴 백슬래시를 넣고 find인수를 받으면 불평할 수 있습니다 \(. 괄호를 한 번만 인용하면 충분합니다 open="(".open=\(

표현식 목록을 작성해야 하는 경우 find배열이 있는 쉘을 사용하십시오(Bash 또는 일반 이외의 거의 모든 것 sh).

args=()  
args+=( -name "*.ab" )
args+=( -or -name "*.bc" ) 

find ... \( "${args[@]}" \)

필요에 따라 배열 구성을 루프로 래핑합니다.

답변2

잘못된 유형의 변수를 사용했고 이를 참조하는 것을 잊어버렸습니다.

여기에는 여러 매개변수를 저장하기 위한 배열이 필요합니다.

#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path

find "$path" -type f "$open" -name "${pat[@]}" "$close"

*.abOR이 아닌 AND 매개변수를 전달한다는 점에 유의하세요 . 이러한 따옴표와 백슬래시는 쉘 구문의 일부입니다.(find'*.ab'\(

eval예를 들어 이를 평가하기 위해 쉘 명령줄을 빌드하려는 경우 에만 이 작업을 수행합니다.

#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

eval 'find "$path" -type f '"$open -name $pat $close"

그런 다음 쉘이 평가를 수행하도록 하십시오.

find "$path" -type f \( -name '*.ab' -o -name '*.bc \)

위에서 언급한 대로 find다음 매개변수를 사용하여 호출이 발생합니다.

  • find
  • path(콘텐츠 $path)
  • -type
  • f
  • (
  • *.ab
  • -o
  • -name
  • *.bc
  • )

답변3

변수를 사용하는 대신 간단한 접근 방식을 사용하십시오.

find $path -type f -name "*.ab" -o \( -name "*.bc" \)

관련 정보