如何删除所有名称中不包含指定字符串的一级子文件夹

如何删除所有名称中不包含指定字符串的一级子文件夹

我知道有很多关于如何删除所有文件 或者没有名称中包含某个字符串,以及如何删除所有子文件夹 他们的名字中包含某个字符串。

然而,没有关于如何删除所有子文件夹 没有名称中包含某个字符串。

那么,由于我最近遇到了这样的问题,是否有一个快速命令可以帮助解决这种情况? 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

相关内容