명령줄을 사용하여 지정된 파일/폴더를 제외한 모든 파일을 삭제하시겠습니까?

명령줄을 사용하여 지정된 파일/폴더를 제외한 모든 파일을 삭제하시겠습니까?

다음과 같은 구조를 가진 많은 폴더와 다양한 파일이 포함된 폴더가 있습니다.

NASA
├── a
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
├── b
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
├── c
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
├─ x
├─ y
└─ z     

NASA/지정된 폴더와 파일을 제외한 폴더( )의 내용을 삭제하고 싶습니다 .

a예를 들어 폴더, b폴더 및 파일을 유지하고 싶습니다 x.

나는 노력했다이 솔루션 :

 rm !(a/) -r NASA/

그리고 (답변에서 설명했듯이여기):

find NASA/ -type f ! -iname "x" -delete

그러나 이것은 그리 간단하지 않으며 bash 스크립트를 사용해야 합니다.

더 쉬운 방법이 없나요? 단일 명령으로 이 작업을 어떻게 수행할 수 있습니까?

답변1

GLOBIGNOREglobbing 중에 무시할 이름을 설정한 다음 *다른 모든 파일/디렉터리와 일치시키는 데 사용할 수 있습니다 .

GLOBIGNORE='a:b:x'; rm -r *

예:

$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
├── c
│   ├── 1
│   ├── 2
│   └── 3
├── x
├── y
└── z

/NASA$ GLOBIGNORE='a:b:x'

/NASA$ rm -r *

/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
└── x

find또는 다음 디렉터리 에서 를 사용할 수 있습니다 NASA.

find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +

예:

/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
├── c
│   ├── 1
│   ├── 2
│   └── 3
├── x
├── y
└── z


/NASA$ find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +


/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
└── x

답변2

확장 글로빙을 사용할 수 있지만 느낌표가 표시됩니다.~ 전에패턴:

rm -rf NASA/!(a|b|x)

extglob켜져 있지 않으면 먼저 활성화하십시오 .

shopt -s extglob

관련 정보