显示仅包含文件的目录路径
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=]
这是我的文件夹结构。
在 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=]