Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 删除不包含';没有具有特定名称的子目录_Bash_Find - Fatal编程技术网

Bash 删除不包含';没有具有特定名称的子目录

Bash 删除不包含';没有具有特定名称的子目录,bash,find,Bash,Find,我想删除所有没有目录b的目录。树结构如下所示: --directory1 | directoryA---directoryB | directoryC | directoryD---directoryB 我在目录1中尝试了以下脚本: du -a -h --max-depth=1 | sort -hr 所以我知道我要删除的所有目录的大小都是8k。如果我在目录1之外尝试下面的脚本,它

我想删除所有没有
目录b
的目录。树结构如下所示:

--directory1
         |
          directoryA---directoryB
         |
          directoryC
         |
          directoryD---directoryB
我在目录1中尝试了以下脚本:

du -a -h --max-depth=1 | sort -hr
所以我知道我要删除的所有目录的大小都是8k。如果我在目录1之外尝试下面的脚本,它几乎显示了目录中的所有内容

find directory1 -maxdepth 1 -type d -size 8
我认为我的安全选择是删除没有
directoryB
的目录。我该怎么做呢?

我想你不需要找到这个。一个简单的循环就可以了

for d in directory1/*/; do
  if ! test -d "${d}directoryB"; then
    echo rm -r "${d}"
  fi
done
如果您对输出满意,请删除echo。

使用和:

  • 查找。
    在当前工作目录中查找
  • -仅键入d
    文件夹
  • -深度
    深度优先模式
  • -深度1
    强制深度为1
  • -exec测试-e“{}/dirB/”\如果此文件不包含
    dirB
  • -打印
    打印路径
  • find-类型d-深度-深度1-exec测试-e“{}/dirB/”\-打印
    

    如果输出正常,则将
    -print
    替换为
    -exec rm-r“{}”

    find-类型d-深度-深度1-exec测试-e“{}/dirB/”\-exec rm-rf{}\;
    

    例如:

    $tree
    .
    |--迪拉
    |“迪布
    |--迪尔克
    |`--dirX
    `--迪德
    `--肮脏的
    6个目录,0个文件
    $
    $
    $find-类型d-深度-深度1-exec测试-e“{}/dirB/”\-exec rm-rf{}\;
    $
    $tree
    .
    |--迪拉
    |“迪布
    `--迪德
    `--肮脏的
    4个目录,0个文件
    $
    
    它们是否始终处于同一级别?或者它们可能处于不同的深度?我看到您正在使用find的
    -maxdepth 1
    ,但那是在您检查尺寸时。如果它们始终处于同一水平,@oguz解决方案是完美的。如果没有,请添加
    shopt-s globstar
    并使用
    directory1/***/
    在可变深度执行相同的操作。您可能希望在之后关闭globstar-
    set+o globstar
    @PaulHodges,是的,它们始终处于同一级别。这表示查找:路径必须位于GNU find的表达式“1”之前。仍在调试深度问题,现在应予以修复。仍然是相同的错误。你有什么版本的find?我的是
    find(GNU findutils)4.7.0
    .Mm,不确定是哪个版本,
    find--version
    返回
    非法选项
    。似乎是一个相当旧的版本,有什么建议来获得实际的版本吗<代码>人工查找
    不显示任何版本信息,仅显示发布日期:2011年9月28日BSD.BSD find then。我想这个答案在MacOS和BSD发行版上很好,但在Linux上不行