使用命令列刪除除指定檔案/資料夾之外的所有檔案?

使用命令列刪除除指定檔案/資料夾之外的所有檔案?

我有一個包含許多資料夾和不同文件的資料夾,其結構如下:

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

相關內容