我知道有很多关于如何删除所有文件 和或者没有名称中包含某个字符串,以及如何删除所有子文件夹 和他们的名字中包含某个字符串。
然而,没有关于如何删除所有子文件夹 没有名称中包含某个字符串。
那么,由于我最近遇到了这样的问题,是否有一个快速命令可以帮助解决这种情况? bash 脚本也足够好。
编辑:
经过子文件夹,我的意思只是删除第一级子文件夹,因为我不想删除第二级或第三级子文件夹,这些子文件夹的名称可能没有字符串,或者第一级子文件夹有字符串。
答案1
假设您想find
从当前目录开始,并将其限制为第一级子目录:
find . -maxdepth 1
该find
命令有一个有用的标志-not
(或!
),它否定了以下测试。因此,为了找到一个符合以下条件的名称不是包含子字符串,添加
-not -name "*substring*"
重要提示:您还需要排除当前目录本身。否则,整个当前目录将被删除。
-not -name "."
然后您只想测试目录:
-type d
如果一切看起来都很好,您需要删除以下目录:
-exec rm -rf {} \;
它表示“对所有找到的目录执行此命令” {}
。占位符作为目录名称(包括完整路径,以便它在正确的路径上工作)。\;
表示要执行的命令的结束。
总结:
find . -maxdepth 1 -not -name "*substring*" -not -name "." -type d -exec rm -rf {} \;
应该可以。但首先,请先尝试一下不带该-exec
部件的情况。
答案2
bash shell 的扩展的 glob运算符可以进行模式否定,例如给定
$ tree .
.
├── subdir
│ ├── other file
│ └── somefile
├── subdirbar
│ ├── other file
│ └── somefile
├── subdirbaz
│ ├── other file
│ └── somefile
└── subdirfoo
├── other file
└── somefile
4 directories, 8 files
然后如果启用了扩展通配符(shopt -s extglob
)
$ rm -rf !(*foo*)
(递归地)删除所有不包含字符串的顶级目录foo
,留下
$ tree
.
└── subdirfoo
├── other file
└── somefile
1 directory, 2 files
然而,这也会删除任何文件名称不包含foo
在顶层。据我所知,bash 扩展 glob 无法区分文件和目录 - 但 zsh 提供了glob 限定符,例如允许
% tree
.
├── foofile
├── other file
├── somefile
├── subdir
│ ├── other file
│ └── somefile
├── subdirbar
│ ├── other file
│ └── somefile
├── subdirbaz
│ ├── other file
│ └── somefile
└── subdirfoo
├── other file
└── somefile
4 directories, 11 files
然后在zsh
% setopt EXTENDED_GLOB
% ls -d (^(*foo*))
other file somefile subdir subdirbar subdirbaz
而添加(/)
目录限定符
% ls -d (^(*foo*))(/)
subdir subdirbar subdirbaz
所以
% rm -rf (^(*foo*))(/)
仅移除目录其名称不包含字符串foo
,保留纯文本文件不变。
% tree
.
├── foofile
├── other file
├── somefile
└── subdirfoo
├── other file
└── somefile
1 directory, 5 files