다음과 같은 구조를 가진 많은 폴더와 다양한 파일이 포함된 폴더가 있습니다.
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
GLOBIGNORE
globbing 중에 무시할 이름을 설정한 다음 *
다른 모든 파일/디렉터리와 일치시키는 데 사용할 수 있습니다 .
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