我想要一个 find 命令(或类似命令),当指向某个文件夹时,它会列出该文件夹或其子文件夹中的所有文件,但前提是该文件夹仅包含一个文件。换句话说,我想列出仅包含一个文件的文件夹的内容。
因此给出以下文件
/Foldera/folderb
/Foldera/folderb/test1.txt
/Foldera/folderb/test2.txt
/Foldera/folderc
/Foldera/folderd/test3.txt
/Foldera/folderc/foldere
它将输出
/Foldera/folderd/test3.txt
答案1
使用 Bash 3:
find . -type d -exec sh -c \
'[[ $(find "$0" -mindepth 1 | wc -l) -eq 1 ]] && [[ $(find "$0" -mindepth 1 -type d | wc -l) -eq 0 ]] && echo "$0"' \
{} \;
使用 Bash 4:
shopt -s globstar
for dir in **/; do
[[ $(find "$dir" -mindepth 1 | wc -l) -eq 1 ]] && [[ $(find "$dir" -mindepth 1 -type d | wc -l) -eq 0 ]] && echo "$dir"
done
本质上,迭代每个目录,然后检查该目录是否只包含一个子目录(文件或目录),并检查该子目录是否不是目录。如果只有一个子目录,并且它不是目录,则echo
它。
请注意:如果目录或文件名称中包含换行符,则此操作会失败。
find
如果您有 GNU 实用程序(例如带有选项的实用程序),则可能会更容易做到,-printf
但 OS X 默认没有该选项。
答案2
我没有 Mac 来测试这个问题,但是当我在 Google 上搜索你的问题时,我找到了很多答案。
find . -type 'f' -printf '%h\n' | sort | uniq -c
它将打印每个文件夹中有多少个文件,然后使用 grep 或其他工具可以缩小范围。
我会检查下面的源代码,它是适用于 Windows,但他们有很多可能同样有效的 perl 解决方案。
类似问题:来源