파일 열거 *.pdf 제외 *_book.pdf

파일 열거 *.pdf 제외 *_book.pdf

dir의 모든 파일을 열거하고 패턴으로 제외하는 방법은 무엇입니까?

예: 모든 *.pdf는 *_book.pdf를 제외합니다. 나는 그렇게 노력한다:

for $PDF in $(ls *.pdf | grep -v *_book.pdf);
do
   echo "File $PDF"
done

좋은 방법인가요? 다른 방법이 있나요? 사용된만약에성명 또는 기타.

답변1

ls스크립트에서는 사용하지 마세요 .

또한 루프에서 선언하는 변수에는 for달러 기호가 있어서는 안 됩니다. 달러 기호보간하다변수의 값; 따라서 $PDF"이름이 "인 변수의 현재 값 PDF"으로 읽습니다.

for PDF in *.pdf
do
    case $PDF in
     *_book.pdf) continue;;
    esac
    echo "File $PDF"
done

이 구문은 일부 초보자에게 겁을 주지만 이와 같은 경우에는 case구문을 훨씬 선호합니다 . if그러나 원하는 경우 다음을 사용할 수 있습니다.

    if [[ $PDF =~ _book\.pdf$ ]]; then
        continue
    fi

아니면 속기

    [[ $PDF =~ _book\.pdf$ ]] && continue

caseshPOSIX 및 오래된 원본 Bourne 에도 이식할 수 있다는 추가 이점이 있습니다 sh.

의 패턴 case은 glob이고 정규 표현식을 사용합니다(따라서 before [[ $variable =~ regex ]]가 없어야 함 ).*_book

답변2

shopt -s extglob(시스템의 기본값일 수 있으며, 그렇지 않으면 설정할 수 있음)을 사용하면 확장 일치를 사용할 수 있으며 여기에는 부정 일치 패턴이 포함됩니다.

# Directry contents
>ls -1
1_book_not.pdf
1_book.pdf
1.pdf
1.txt

# With negative match
>ls -1 !(*_book).pdf
1_book_not.pdf
1.pdf

답변3

표현식에 약간의 구문 오류가 있습니다 for. 대신 다음을 시도해 보세요.

for PDF in $(ls *.pdf | grep -v *_book.pdf);
do
   echo "File $PDF"
done

이것은 잘 작동하는 것 같습니다.

답변4

또 다른 옵션은 다음을 사용하는 것입니다 find.

find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'

예를 들어, 다음 네 개의 파일이 있는 디렉터리를 생각해 보세요.

$ ls
a_book.pdf  book.txt  nook.pdf  not_book1.pdf

이제 다음 명령을 실행하세요.

$ find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'
./not_book1.pdf
./nook.pdf

작동 원리

  • find .find에게 현재 디렉토리에서 검색을 시작하라고 지시합니다.

  • -maxdepth 1find에게 하위 디렉토리를 건너뛰라고 지시합니다.

  • -name '*.pdf'이름이 if로 끝나는 파일을 찾도록 find에게 지시합니다 .pdf.

  • ! -name '*_book.pdf'이름이 로 끝나는 모든 파일을 출력에서 ​​제외하도록 검색 결과에 지시합니다 _book.pdf.

관련 정보