使用命令行删除指定文件/文件夹以外的所有文件?
我有一个包含大量文件夹和不同文件的文件夹,具有以下结构:
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脚本。
我错过了一个更简单的方法吗? 我怎么能在一个命令中执行此操作?
您可以使用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
或者,您可以从NASA
目录中使用find
:
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
您可以使用扩展的globbing,但感叹号在模式之前 :
rm -rf NASA/!(a|b|x)
如果未启用extglob
激活它:
shopt -s extglob