Bash에서 여러 예외를 제공하면서 와일드카드 rm 파일을 대상으로 지정하는 방법은 무엇입니까?

Bash에서 여러 예외를 제공하면서 와일드카드 rm 파일을 대상으로 지정하는 방법은 무엇입니까?

다음과 같은 파일 목록이 있습니다.

메인.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

GLOBIGNOREBash에는 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' |

관련 정보