显示仅包含文件的目录路径

Show directory path with only files present in them

这是我的文件夹结构。

root 文件夹中使用查找命令 find . -type d 得到以下结果

结果

./folder1
./folder1/folder2
./folder1/folder2/folder3

但是,我希望结果只有 ./folder1/folder2/folder3。即仅当内部存在 .txt 类型的文件时才打印结果。

有人可以帮助解决这个问题吗?希望它有意义。

您可以使用此 find 命令查找所有 *.txt 文件,然后它获得唯一的父目录名称:

find . -type f -name '*.txt' -exec bash -c '
for f; do
   f="${f#.}"
   printf "%s[=10=]" "$PWD${f%/*}"
done
' _ {} + | awk -v RS='[=10=]' '!seen[[=10=]]++'
  • 我们正在使用 printf "%s[=13=]" 使用换行符、空格和 glob 字符来处理目录名称。
  • 使用 gnu-awk 只打印唯一的目录名

使用关联array and Process Substitution

#!/usr/bin/env bash

declare -A uniq_path

while IFS= read -rd '' files; do
  path_name=${files%/*}
  if ((!uniq_path["$path_name"]++)); then
    printf '%s\n' "$path_name"
  fi
done < <(find . -type f -name '*.txt' -print0)

检查 uniq_path

的值
declare -p uniq_path
find . -type f -name '*.txt' |
sed 's=/[^/]*\.txt$==' |
sort -u

查找所有 .txt 文件,删除文件名 sed 以仅获取父目录,然后 sort -u 删除重复项。

这不适用于包含新行的文件 names/paths。

也许这个 POSIX 一个?

find root -type f -name '*.txt' -exec dirname {} \; | awk '!seen[[=10=]]++'

* 在每个目录路径 后添加尾随 \n
* 当路径中的目录名称中包含 \n 时中断

还是这个 BSD/GNU 一个?

find root -type f -name '*.txt' -exec dirname {} \; -exec printf '[=11=]' \; | sort -z -u

* 在每个目录路径后添加尾随 \n[=14=]