如何编写Shell脚本递归列出包含NEW子目录的所有父目录?
嘿,这个需求很容易实现,我给你分享几种简洁可靠的Shell方案,不管是直接用单行命令还是写成脚本都可以:
方法一:单行命令快速实现
最直接的方式是用find配合dirname和sort -u,一行搞定:
find /your/start/path -type d -name "NEW" -exec dirname {} \; | sort -u
拆解一下每个部分的作用:
find /your/start/path -type d -name "NEW":递归查找起始路径下所有名为NEW的子目录-exec dirname {} \;:对每个找到的NEW目录,用dirname命令提取它的父目录sort -u:对结果排序并去重,确保每个父目录只输出一次
如果你的起始路径是当前目录,直接把/your/start/path换成.就行。
方法二:用sed替代dirname(另一种思路)
如果你习惯用文本处理工具,也可以用sed来裁剪掉路径末尾的/NEW:
find /your/start/path -type d -name "NEW" | sed 's/\/NEW$//' | sort -u
这个效果和上面完全一样,只是处理路径的方式不同而已。
方法三:封装成可复用的Shell脚本
如果需要经常用这个功能,把它写成脚本会更方便,还能加参数校验:
#!/bin/bash # 检查用户是否提供了起始路径参数 if [ $# -ne 1 ]; then echo "用法: $0 <起始目录路径>" echo "示例: $0 /home/user/documents" exit 1 fi start_directory="$1" # 检查起始目录是否存在 if [ ! -d "$start_directory" ]; then echo "错误: 目录 '$start_directory' 不存在或无法访问" exit 1 fi # 执行查找并输出结果 echo "所有包含NEW子目录的父目录:" find "$start_directory" -type d -name "NEW" -exec dirname {} \; | sort -u
使用步骤:
- 把上面的代码保存为
find-new-parent-dirs.sh - 给脚本添加执行权限:
chmod +x find-new-parent-dirs.sh - 运行脚本:
./find-new-parent-dirs.sh /your/start/path
注意事项
- 这些方案都能处理目录名包含空格、特殊字符的情况,因为我们用了双引号包裹路径变量,
find的{}也会正确处理特殊字符 sort -u是为了避免因为符号链接或者重复查找导致的重复输出,如果你确定不会有重复,也可以去掉,但加上更稳妥
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

