파일 2개 빼고 모두 삭제

파일 2개 빼고 모두 삭제

두 개의 파일을 제외하고 폴더의 모든 항목을 삭제하고 싶습니다.

exec.js
.git

나는 이것을 찾았다:

rm !(exec.js|.git)

이것은 CL에서 작동하지만 sh 파일에 저장하고 다음을 사용하여 호출하려고 하면 다음을 사용합니다 bash file.sh.

test.sh: line 1: syntax error near unexpected token `('
test.sh: line 1: `rm !(exec.js|.git)'

어떤 아이디어가 있나요?

답변1

당신은해야합니다

shopt -s extglob

스크립트 내부.

Bash 구성은 대화형 셸에 대해 이 기능을 자동으로 켤 수 있습니다(아마도 상황에 맞는 완성을 위해 bash-completion 패키지를 로드했기 때문일 수 있음). 스크립트 내에서 수동으로 켜야 합니다.

또한 스크립트가 #!/bin/bash( 또는 유사한 변형으로 시작하는지 확인하십시오 #!/usr/bin/env bash. 그렇지 않으면 이 구문을 지원하지 않는 다른 셸에서 실행될 수 있습니다.

예를 들어, 이 스크립트는 일부 파일을 생성한 다음 유지하려는 파일 두 개를 제외하고 모두 삭제합니다.

$ cat x
#!/bin/bash

shopt -s extglob

touch f1 f2 f3 exec.js .git foo bar

echo Before: $(ls -A)

rm !(exec.js|.git)

echo After: $(ls -A)

실행 중:

$ bash x
Before: .git bar exec.js f1 f2 f3 foo x
rm: cannot remove '.': Is a directory
rm: cannot remove '..': Is a directory
After: .git exec.js

및를 사용하면 .오류가 발생합니다 ... 명령줄에서도 다음을 볼 수 있습니다.

$ touch f1 f2 f3 exec.js .git foo bar

$ rm !(exec.js|.git)
rm: cannot remove '.': Is a directory
rm: cannot remove '..': Is a directory

답변2

제안으로 추가할 수 있습니다.

GLOBIGNORE=.:..

shopt -s extglob오류를 피하기 위해 나중에 rm: cannot remove '.': Is a directory.

관련 정보