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

解决Shell中无法在if-else用sed筛选最后目录为nn的路径问题

解决方法

问题根源

你原脚本的核心错误是在[[ ... ]]条件判断里直接写sed命令,既没有传入目标路径作为输入,也没有用命令替换$(...)获取sed的执行结果,导致实际是在比较字符串sed 's|[/](.*)*[/]||g'和nn,永远无法匹配。另外原sed的正则表达式写法也不正确,提取目录最后一级的正则应该是s|.*/||。

可行方案

方案1:修正原脚本,用basename简化判断

basename命令可以直接获取路径的最后一级目录,比sed更直观可靠:

find "$(pwd)" -iname '*.py' | xargs grep -l 'nn' | xargs dirname | sort -u | while read dir; do
  if [[ $(basename "$dir") == 'nn' ]]; then
    echo "$dir"
  fi
done

方案2:用awk合并去重与筛选,减少管道开销

把去重(替代sort -u)和结尾判断合并到awk中,提升效率:

find "$(pwd)" -iname '*.py' -exec grep -l 'nn' {} \; | xargs dirname | awk '!seen[$0]++ && /\/nn$/'
  • !seen[$0]++:记录已出现的目录,实现去重
  • /\/nn$/:匹配以/nn结尾的目录,即最后一级是nn

方案3:全程用循环处理,避免xargs的潜在问题

如果文件名包含特殊字符(如空格),xargs可能出错,改用while循环处理每个文件:

find "$(pwd)" -iname '*.py' -exec grep -l 'nn' {} \; | while read -r file; do
  dir=$(dirname "$file")
  if [[ $(basename "$dir") == 'nn' ]]; then
    echo "$dir"
  fi
done | sort -u

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:10:50