如何在Bash中移除文件内含子目录的路径,保留根目录路径
只保留顶层目录路径,排除所有子目录条目
嘿,这个需求很常见——要从一堆目录路径里筛选出最顶层的父目录,删掉所有嵌套的子目录条目对吧?我给你几个实用的命令行方案,都是在终端里就能直接跑的:
方法1:用Awk(最准确,支持去重)
这个方法会先把所有路径存入数组,然后逐个检查每个路径是否是某个顶层目录的子目录,只保留那些没有父目录在列表里的路径:
awk '{ # 把所有路径存入数组,自动去重 paths[$0] = 1 } END { # 遍历每个路径 for (p in paths) { current = p is_subdir = 0 # 不断去掉最后一级目录(包括末尾的斜杠),检查父目录是否存在 while (sub(/\/[^\/]*\/?$/, "", current)) { if (current in paths) { is_subdir = 1 break } } # 如果不是子目录,就打印出来 if (!is_subdir) { print p } } }' your_file.txt > filtered.txt
使用说明:
- 把
your_file.txt替换成你的实际文件名 - 结果会保存到
filtered.txt里,里面就是所有顶层目录路径 - 这个方法会自动去除重复的路径,如果需要保留重复的顶层目录,可以去掉
paths[$0] = 1的逻辑,改用数组存所有行再处理。
方法2:排序后用Awk过滤(更简洁)
如果你的路径层级很规整,排序后子目录会紧跟在父目录后面,这个方法更高效:
# 先统一去掉路径末尾的斜杠,再排序,最后过滤 sed 's/\/$//' your_file.txt | sort | awk '!index($0, prev "/") {print; prev=$0}' > filtered.txt
原理:
sed 's/\/$//':去掉所有路径末尾的斜杠,统一格式sort:排序后,父目录会排在它的所有子目录前面awk:检查当前行是否以之前保留的顶层目录为前缀,如果不是,就打印并更新顶层目录标记
方法3:用Grep反向匹配(适合简单场景)
如果已经知道顶层目录的命名规律(比如都是datadirN),也可以先提取顶层目录,再排除子目录:
# 先提取所有顶层目录(假设顶层目录是/path/to/dir/datadirN格式) grep -E '^/path/to/dir/datadir[0-9]+/?$' your_file.txt > top_dirs.txt # 然后从原文件中只保留顶层目录 grep -xFf top_dirs.txt your_file.txt > filtered.txt
注意:
这个方法需要你明确顶层目录的格式,通用性不如前两种,但在特定场景下很方便。
内容的提问来源于stack exchange,提问作者Adrian Iacob
相关产品推荐
相关产品推荐

