尝试查找仅包含一个文件的文件夹

尝试查找仅包含一个文件的文件夹

我想要一个 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 解决方案。

类似问题:来源

相关内容