dir의 모든 파일을 열거하고 패턴으로 제외하는 방법은 무엇입니까?
예: 모든 *.pdf는 *_book.pdf를 제외합니다. 나는 그렇게 노력한다:
for $PDF in $(ls *.pdf | grep -v *_book.pdf);
do
echo "File $PDF"
done
좋은 방법인가요? 다른 방법이 있나요? 사용된만약에성명 또는 기타.
답변1
또한 루프에서 선언하는 변수에는 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
case
sh
POSIX 및 오래된 원본 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 1
find에게 하위 디렉토리를 건너뛰라고 지시합니다.-name '*.pdf'
이름이 if로 끝나는 파일을 찾도록 find에게 지시합니다.pdf
.! -name '*_book.pdf'
이름이 로 끝나는 모든 파일을 출력에서 제외하도록 검색 결과에 지시합니다_book.pdf
.