find
다음은 제가 실행하려는 명령의 몇 가지 예 입니다 . 저는 와일드카드를 사용하여 (예를 들어) 조건자가 함께 연결된 find 명령을 생성할 수 있는 다양한 방법을 찾고 있습니다.
find
각 항목 앞에 -name이 필요하고 각 항목 사이에 -o가 필요하기 때문에 작동하지 않습니다 .
find . -name \*.{sh,pl,sql}
#find . -name *.sh *.pl *.sql
후행으로 인해 작동하지 않습니다 -o
. 실패할 수밖에 없는 주장을 하는 것이 가능하지만 이상적이지는 않습니다. 또한 내 바로 가기가 이제 내 출력보다 길어졌습니다.
find . `for X in {sh,pl,sql}; do echo -name \\\*.$X -o ;done`
#find . -name \*.sh -o -name \*.pl -o -name \*.sql -o
하나의 매개변수( )로 그룹화되어 있기 때문에 실패합니다 find: unknown predicate '-name *.sh'
. 또한 -o와의 연결 부족이 여전히 나타납니다.
find . -name\ \*.{sh,pl,sql}
작동하지만 와일드카드가 포함되지 않습니다(답변: 답변이 아님).
find . -regex '.*\(sh\|pl\|sql\)'
ベストアンサー1
IMHO, 이 -false
아이디어가 핵심입니다. 다음을 추가하겠습니다.
find . -false $(echo "-o -name *."{sh,pl,sql})
간단히 everything 을 인용하여 bash가 전체 패턴을 반복하도록 할 수 있으며 -o -name
, 그런 다음 하위 쉘에서 이를 반환하여 인용으로 만들어진 그룹을 "해제"할 수 있습니다. 이 접근 방식의 문제점은 패턴의 따옴표가 작동하지 않는다는 것입니다.
편집: 이 솔루션의 또 다른 함정에 대해서는 Michał Šrajer의 의견을 참조하십시오. 별표 앞에 백슬래시를 넣을 수는 없습니다. 명령 대체는 *
확장될 a 를 반환하거나 \*
있는 그대로 find(!)에 전달될 a 를 반환합니다. 적어도 그것이 내 로컬 bash가 작동하는 방식입니다.
이것이 내가 할 수 있는 최선이다:
(GLOBIGNORE='*:.*'; find . \( -false $(echo "-o -name *."{sh,pl,sql,xml}) \) -print)
행운을 빌어요:)
그런데 만약 당신이 그렇다면아니요더 많은 매개변수를 추가하려면 find
물론 를 사용하세요 xargs
. 이 경우에는 따옴표와 모든 항목이 완벽하게 작동합니다.
echo "-o -name *."{sh,pl,sql} | xargs find . -false