두 개의 파일을 제외하고 폴더의 모든 항목을 삭제하고 싶습니다.
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
.