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 列出linux中的所有叶子目录_Bash - Fatal编程技术网

Bash 列出linux中的所有叶子目录

Bash 列出linux中的所有叶子目录,bash,Bash,在Linux中,有没有一种简单的方法可以只列出给定目录下的目录? 为了更好地解释,我可以: find mydir -type d 其中: mydir/src mydir/src/main mydir/bin mydir/bin/classes 我想要的是: mydir/src/main mydir/bin/classes 我可以在一个bash脚本中实现这一点,该脚本在行上循环,如果下一行包含路径,则删除前一行,但我想知道是否有一个更简单的方法不使用bash循环。我想不出任何东西可以在没有循

在Linux中,有没有一种简单的方法可以只列出给定目录下的目录? 为了更好地解释,我可以:

find mydir -type d
其中:

mydir/src
mydir/src/main
mydir/bin
mydir/bin/classes
我想要的是:

mydir/src/main
mydir/bin/classes

我可以在一个bash脚本中实现这一点,该脚本在行上循环,如果下一行包含路径,则删除前一行,但我想知道是否有一个更简单的方法不使用bash循环。

我想不出任何东西可以在没有循环的情况下实现这一点。下面是一些循环:

这将显示当前目录下的叶目录,无论其深度如何:

for dir in $(find -depth -type d); do [[ ! $prev =~ $dir ]] && echo "$dir" ; prev="$dir"; done
此版本正确处理包含空格的目录名:

saveIFS=$IFS; IFS=$'\n'; for dir in $(find -depth -type d ); do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done; IFS=$saveIFS
以下是使用Jefromi建议的版本:

find -depth -type d | while read dir;  do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done

这仍然是一个循环,因为它使用了
sed
中的branch命令:

find -depth -type d |sed 'h; :b; $b; N; /^\(.*\)\/.*\n\1$/ { g; bb }; $ {x; b}; P; D'
基于
info sed
中的脚本(uniq工作方式相同)

编辑以下是带有注释的
sed
脚本(从
info sed复制并修改):

下面是正则表达式正在做的事情:

  • /
    -启动一个模式
  • ^
    -匹配行首
  • \(
    -启动捕获组(反向引用子表达式)
  • *
    -任何字符(.)的零个或多个(*)
  • \)
    -结束捕获组
  • \/
    -斜杠(/)(用
    \
    转义)
  • *
    -任何字符的零个或多个
  • \n
    -换行符
  • \1
    -反向引用的副本(在本例中,它是行首和最后一个斜杠之间的内容)
  • $
    -匹配行的末尾
  • /
    -结束模式

我认为您可以查看所有目录,然后重定向输出,并使用xargs计算每个子目录的文件数,当没有子目录时(xargs find SUBDIR-type d | wc-l…类似于此,我现在无法测试)您已经找到了一个叶


不过,这仍然是一个循环。

如果您正在寻找可视化的东西,
tree-d
很不错

drinks |-- coke | |-- cherry | `-- diet | |-- caffeine-free | `-- cherry |-- juice | `-- orange | `-- homestyle | `-- quart `-- pepsi |-- clear `-- diet 饮料 |--可乐 ||——樱桃 |”“饮食 ||——不含咖啡因 |”“樱桃 |--果汁 |”“橙色 |“家常 |”“夸脱 `--百事可乐 |--清楚的 `--饮食
如果只需要叶目录(不包含任何子目录的目录),请查看。答案也是,但简而言之是:

find . -type d -links 2

尝试以下一种线性测试(在Linux和OS X上测试):


使用
awk
的解决方案很好,很简单……如果目录名包含任何在形成正则表达式模式时被认为是特殊的字符,那么解决方案就会失败。这也会导致
~
出现问题=Bash中的测试

以下内容似乎适用于BSD和GNU find:

find . -type d | sed 's:$:/:' | sort -r | while read -r dir;do [[ "${dir}" != "${prev:0:${#dir}}" ]] && echo "${dir}" && prev="${dir}”;done
  • find.
    更改为要开始搜索的任何目录
  • sed
命令向
查找
  • sort-r
    按逆字母顺序对目录列表进行排序, 这样做的好处是列出了距离目标最远的目录 根首先,这是我们想要的
  • 然后在读取时,
    循环逐行读取此列表,
    其中
    -r
    选项可进一步防止某些 人物与其他人不同
  • 然后我们需要将当前行与前一行进行比较。作为 我们不能使用
    =测试,中间目录将
    具有比相应叶目录的路径短的路径,
    我们的测试将比较当前行和前一行
    到当前行的长度。如果这是一场比赛,那么我们可以
    将该行作为非叶目录丢弃,否则将打印该行
    行,并将其设置为准备下一次迭代的
    prev
    ious行。 请注意,字符串需要在测试语句中引用, 否则可能会产生一些误报
  • 哦,如果你不想使用
    查找

    shopt -s nullglob globstar;printf "%s\n" **/ | sort -r | while read -r dir;do [[ "${dir}" != "${prev:0:${#dir}}" ]] && echo "${dir}" && prev="${dir}";done;shopt -u nullglob globstar
    
    更新(2020-06-03):下面是我编写的一个脚本,希望它有用。显然,请随意改进/调整/指出突出的问题

    #/usr/bin/env bash
    #叶:从给定的源,只输出目录
    #需要(“叶文件夹”)才能重新创建完整的
    #传递给mkdir-p时的目录结构
    用法(){
    echo“用法:${0##*/}[-f |-g |-h |-m |-s |-s |-v]”1>&2
    }
    #初始变量。。。
    dirMethod=0#设置目录列表的默认方法(find-d)
    addSource=0#设置默认输出路径行为
    #使用Bash getopts内置的命令选项处理
    而getopts“:fghm:sSv”选项;做
    中的大小写“${options}”
    f) #使用目录列表的深度优先查找方法
    dirMethod=0#如果用户同时设置f和g,请在此处再次设置
    ;;
    g) #使用目录列表的扩展全局搜索和排序方法
    dirMethod=1
    ;;
    h) #帮助文本
    echo“叶-生成目录的最短列表(可选)”
    echo“从给定源完全重新创建目录结构”
    回音
    回声“选项”
    回声“=============”
    使用
    回声
    echo“目录列表方法”
    回声“---------------------------”
    echo“-f使用具有深度优先搜索[默认]的查找命令”
    echo“-g使用外壳球形法”
    回声
    回显“输出选项”
    回声“-------”
    echo“-m在目录中创建目录结构”
    echo“-v详细输出[与-m选项一起使用]”
    echo“-s输出包括源目录”
    echo“-S输出包括目录的完整给定路径”
    回声
    
    find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' \;
    
    find . -type d | sed 's:$:/:' | sort -r | while read -r dir;do [[ "${dir}" != "${prev:0:${#dir}}" ]] && echo "${dir}" && prev="${dir}”;done
    
    shopt -s nullglob globstar;printf "%s\n" **/ | sort -r | while read -r dir;do [[ "${dir}" != "${prev:0:${#dir}}" ]] && echo "${dir}" && prev="${dir}";done;shopt -u nullglob globstar