You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

使用步骤:

  1. 把上面的代码保存为find-new-parent-dirs.sh
  2. 给脚本添加执行权限:chmod +x find-new-parent-dirs.sh
  3. 运行脚本:./find-new-parent-dirs.sh /your/start/path

注意事项

  • 这些方案都能处理目录名包含空格、特殊字符的情况,因为我们用了双引号包裹路径变量,find的{}也会正确处理特殊字符
  • sort -u是为了避免因为符号链接或者重复查找导致的重复输出,如果你确定不会有重复,也可以去掉,但加上更稳妥

内容的提问来源于stack exchange,提问作者Mehdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:28:21