![Bash에서 여러 예외를 제공하면서 와일드카드 rm 파일을 대상으로 지정하는 방법은 무엇입니까?](https://linux55.com/image/212638/Bash%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%EC%98%88%EC%99%B8%EB%A5%BC%20%EC%A0%9C%EA%B3%B5%ED%95%98%EB%A9%B4%EC%84%9C%20%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%20rm%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%8C%80%EC%83%81%EC%9C%BC%EB%A1%9C%20%EC%A7%80%EC%A0%95%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 같은 파일 목록이 있습니다.
메인.acn 메인 프로그램.acr 메인 프로그램.alg 주 보조 파일 메인 프로그램.glg 메인 프로그램.glo 메인 프로그램.gls 기본 메인 프로그램.lof 메인 로그 마스터 배치 메인 프로그램.nlo 메인 출력 메인.pdf 마스터 파일 메인 디렉토리
main.*
다음을 제외한 모든 파일을 rm하고 싶습니다 .마스터 파일그리고메인.pdf문서.
시도해 보았으나 rm main.* !("main.tex","main.pdf")
작동하지 않고 main.*
예외 없이 모두 삭제되었습니다.
어떤 아이디어가 있나요?
답변1
!("main.tex","main.pdf")
가 아닌 모든 항목과 일치하므로 main.tex,main.pdf
디렉터리의 모든 파일과 일치할 수 있습니다.
주목해야 할 중요한 점은 그 자체가 그 중 하나가 아닌 것과 일치하기 때문에 !(...)
이미 처럼 동작한다는 것입니다. *
구분 기호는 이고 |
은(는) 아닙니다 ,
.
따라서 main.!(tex|pdf)
작동해야 합니다. 또는 !(main.tex|main.pdf)
이름이 로 끝나는 파일뿐만 아니라 이 두 파일을 제외한 모든 파일을 삭제하려는 경우 main.
.
바라보다:
답변2
덜 복잡한 방법은 보관하려는 파일을 저장하고 모든 항목(기타)을 삭제한 다음 저장된 파일을 다시 저장하는 것입니다. 또한 POSIX 호환 솔루션이기도 합니다.
mkdir x # File or directory must not already exist
mv main.tex main.pdf x # Save the files you want to keep
rm ./* # Ignore the error about not deleting 'x'
mv x/* . # Restore everything you saved. Notice the dot!
rmdir x # Tidy up
x
여기서는 아직 존재하지 않는 파일이나 디렉터리를 선택했습니다 . 너~ 할 것이다rm
삭제할 수 없는 오류가 발생하는 x
것은 좋습니다. 사용하지 마세요 rm -rf
!
일반적 으로 rm ./*
도트 파일은 건너뜁니다.
답변3
GLOBIGNORE
Bash에는 glob이 반환한 목록에서 이름을 제외/제거하는 변수도 있습니다 . 한 가지 예:
$ touch main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
$ echo *
main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
$ GLOBIGNORE='main.tex:main.pdf'
$ echo *
one.pdf one.tex three.wow two.pdf two.tex
GLOBIGNORE
위의 예에 표시된 것처럼 무시할 이름을 설명하는 표현식의 콜론으로 구분된 목록일 수 있습니다. 귀하의 질문은 간단한 파일 이름 쌍을 제외하는 것에 관한 것이지만 glob 표현식을 사용할 수도 있습니다.
$ GLOBIGNORE='one.*:two.*'
$ echo *
main.pdf main.tex three.wow
glob(이 예에서는)과 일치하는 이름 목록은 의 *
표현식을 기반으로 평가됩니다 GLOBIGNORE
. 표현식과 일치하는 이름은 목록에서 제거됩니다. 이것은 유용한 기능입니다.
export
많은 경우 예를 들어 를 사용하는 것도 유용합니다 export GLOBIGNORE='main.tex:main.pdf'
.
답변4
저는 이런 상황에 직면할 때마다 파이프를 사용하여 문제를 해결합니다.
ls -1 메인. * | egrep -v '\.pdf|\.tex' |