我想查找包含例如名为 *.txt 的文件的所有目录。但输出不得包含重复项。怎么做?
答案1
尝试:
find . -type f -name "*.txt" -printf '%h\n' | sort | uniq
其工作原理如下:
find . -type f -name "*.txt" -printf '%h\n'
- 查找所有以 ( ) 结尾的文件*.txt
并打印其目录 ( %h
),后跟换行符。
| sort
- 对目录进行排序
| uniq
- 删除重复项
答案2
POSIX 兼容应该适用的代码任何文件名:
find . -name '*.txt' -printf '%h\0' | tr '\0\n' '\n\0' | sort -u | tr '\0\n' '\n\0'
答案3
问题可能是目录名称可以包含换行符,因此 find 的输出应该以 NUL 终止。为了使排序结果具有可读的输出管道tr
:
find . -name "*.txt" -printf '%h\0' | sort -zu | tr '\0' '\n'
目录名称中的任何换行符都可以通过查看下一行来确定,如果它开头./
不是目录中的换行符。
答案4
使用 GNUfind
和 bash
find . -type d -exec bash -c \
$'for f; do find \"$f\" -maxdepth 1 -type f -name \'*.txt\' -printf \'%h\\n\' -quit; done'\
_ {} +