我有一個包含許多資料夾和不同文件的資料夾,其結構如下:
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
設定在通配時將忽略的名稱,然後用於*
匹配所有其他檔案/目錄:
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