Bash 列出linux中的所有叶子目录
在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循环。我想不出任何东西可以在没有循
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