包含两个或多个文件的目录

包含两个或多个文件的目录

我想找到当前目录的一个子目录,其中(即子目录)包含2个或更多常规文件。

我对包含少于 2 个文件的目录不感兴趣,也不对仅包含子目录的目录感兴趣。

答案1

这是一种基于 GNUfinduniq.与基于执行 shell 命令(对找到的每个目录的文件进行计数)的答案相比,这要快得多,而且对 CPU 更友好。

find . -type f -printf '%h\n' | sort | uniq -d

find命令打印层次结构中所有文件的目录,并且uniq仅显示至少出现两次的目录。

答案2

在...的帮助下吉尔斯的回答及其相反和一些修改,这就是您所需要的。

find . -type d -exec sh -c 'set -- "$1"/*;X=0; 
    for args; do [ -f "$args" ] && X=$((X+1)) ;done; [ "$X" -gt 1 ] ' _ {} \; -print

目录树。

.
├── test
│   ├── dir1
│   │   ├── a
│   │   ├── b
│   │   └── c
│   ├── dir2
│   │   ├── dira
│   │   │   └── a file\012with\012multiple\012line
│   │   ├── dirb
│   │   │   ├── file-1
│   │   │   └── file-2
│   │   └── dirc
│   ├── diraa
│   ├── dirbb
│   ├── dircc
│   └── x
│   └── x1
│   └── x2
└── test2
    ├── dir3
    └── dir4

结果:

./test
./test/dir1
./test/dir2/dirb

答案3

find . -type d \
    -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' \
    -print

这将查找当前目录中或当前目录下的所有名称,然后过滤掉所有不是目录名称的名称。

其余的目录名称将赋予这个简短的脚本:

c=0
for n in "$1"/*; do
    [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 ))
done

[ "$c" -ge 2 ]

该脚本将计算第一个命令行参数(来自 )给出的目录中常规文件的数量(跳过符号链接)find。脚本中的最后一个命令用于测试计数是否为 2 或更大。这个测试的结果就是脚本的返回值(退出状态)。

如果测试成功,-print将会find打印出该目录的路径。

要同时考虑隐藏文件(名称以点开头的文件),请将sh -c脚本从以下内容更改为

for n in "$1"/*; do

for n in "$1"/* "$1"/.*; do

测试:

$ tree
.
`-- test
    |-- a
    |-- dir1
    |   |-- a
    |   |-- b
    |   `-- c
    `-- dir2
        |-- dira
        |-- dirb
        |   |-- file-1
        |   `-- file-2
        `-- dirc

6 directories, 6 files

$ find . -type d -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' -print
./test/dir1
./test/dir2/dirb

答案4

其他find+wc方法:

find path/currdir -maxdepth 1 -type d ! -empty ! -path "path/currdir" \
-exec sh -c 'count=$(find "$1" -maxdepth 1 -type f | wc -l); [ $count -ge 2 ]' _ {} \; -print

  • path/currdir- 当前目录的路径

  • -maxdepth 1- 仅考虑直接的子子文件夹

  • ! -empty- 忽略空子文件夹

  • ! -path "path/currdir"- 忽略当前目录路径

  • count=$(find "$1" -maxdepth 1 -type f | wc -l)-count为每个找到的子文件夹分配文件数

  • [ $count -ge 2 ] ... -print- 打印包含 2 个或更多常规文件的子文件夹名称/路径

相关内容