如何从 CLI 计算 Linux 上每个子目录中的文件数量

如何从 CLI 计算 Linux 上每个子目录中的文件数量

我付费托管的服务器上的文件总数太高了。我需要找到一种方法来计算每个子文件夹中的文件数量,这样我就可以集中注意力在文件较多的区域。

我找不到一个答案来告诉我如何做我想做的事情,所以我想我会发布我的问题然后回答它以便其他人可以使用它。

我的问题是:

如何循环浏览当前目录中的子目录并创建一个列表,显示每个子目录中递归文件的数量(按文件数排序)?

答案1

du --inodes ${topdir} 

将列出每个目录(及其子目录)使用的 inode 数量。您可能希望轻松找出最大的问题:

du --inodes ${topdir} | sort -n

底部的目录将是较大的目录(最后一个目录将是您在上面的命令中传递给du()的目录)。${topdir}

#>du --inodes /usr/share/gimp | sort -n
1       /usr/share/gimp/2.0/fonts
2       /usr/share/gimp/2.0/tags
2       /usr/share/gimp/2.0/themes/Small
2       /usr/share/gimp/2.0/tips
3       /usr/share/gimp/2.0/tool-presets/Selection
3       /usr/share/gimp/2.0/ui/plug-ins
4       /usr/share/gimp/2.0/dynamics/FX
4       /usr/share/gimp/2.0/images
4       /usr/share/gimp/2.0/ui
6       /usr/share/gimp/2.0/brushes/Splatters
6       /usr/share/gimp/2.0/scripts/images
7       /usr/share/gimp/2.0/tool-presets/Sketch
8       /usr/share/gimp/2.0/brushes/Legacy
8       /usr/share/gimp/2.0/dynamics/Basic
8       /usr/share/gimp/2.0/gflare
9       /usr/share/gimp/2.0/brushes/Sketch
9       /usr/share/gimp/2.0/gradients/gimp-obsolete-files
9       /usr/share/gimp/2.0/tool-presets/FX
10      /usr/share/gimp/2.0/gimpressionist/Paper
11      /usr/share/gimp/2.0/brushes/Basic
11      /usr/share/gimp/2.0/gfig
12      /usr/share/gimp/2.0/brushes/Media
13      /usr/share/gimp/2.0/brushes/Texture
17      /usr/share/gimp/2.0/tool-presets/Paint
21      /usr/share/gimp/2.0/dynamics
26      /usr/share/gimp/2.0/gimpressionist/Presets
32      /usr/share/gimp/2.0/menus
34      /usr/share/gimp/2.0/fractalexplorer
37      /usr/share/gimp/2.0/tool-presets
41      /usr/share/gimp/2.0/brushes/gimp-obsolete-files
41      /usr/share/gimp/2.0/palettes
59      /usr/share/gimp/2.0/patterns
61      /usr/share/gimp/2.0/gimpressionist/Brushes
65      /usr/share/gimp/2.0/themes/Default/images/preferences
70      /usr/share/gimp/2.0/themes/Default/images
72      /usr/share/gimp/2.0/themes/Default
75      /usr/share/gimp/2.0/themes
80      /usr/share/gimp/2.0/gradients
98      /usr/share/gimp/2.0/gimpressionist
101     /usr/share/gimp/2.0/brushes
270     /usr/share/gimp/2.0/scripts
881     /usr/share/gimp/2.0
882     /usr/share/gimp

答案2

我在主文件夹中创建了一个名为的文件filecnt,其中包含以下代码行:

for d in *; do
  if [[ -d $d ]]; then
    echo `find $d -type f | wc -l` $d;
  fi
done | sort -n -k1

然后我更改文件权限以允许执行:

chmod 755 ~/filecnt

现在,我可以从任何目录运行~/filecnt以查看当前目录中的子目录列表及其递归文件计数。该列表按文件计数排序(升序)。例如:

0 access-logs
20 logs
187 etc
232 cache
694 tmp
30007 mail
48325 public_html

您只需从 CLI 运行以下命令即可完成相同操作:

for d in *; do if [[ -d $d ]]; then echo `find $d -type f | wc -l` $d; fi done | sort -n -k1

添加-r到最后的sort命令以按降序排序。

为了产生稍微更令人满意的输出,您还可以使用以下代码~/filecnt代替此答案顶部的代码:

echo "File Count    Dir Size  Directory"
echo "----------  ----------  -------------------------"
for d in *; do
  if [[ -d $d ]]; then
    echo `find $d -type f | wc -l` | awk '{printf "%10s  ", $0;}'
    echo `du -h --max-depth=0 $d` | cut -d\  -f 1 $1 | awk '{printf "%10s  ", $0;}'
    echo $d
  fi
done | sort -n -k1
echo

输出如下所示:

File Count    Dir Size  Directory
----------  ----------  -------------------------
         0           0  access-logs
        20        8.3M  logs
       187        4.8M  etc
       232        228K  cache
       694         23M  tmp
     30715        6.4G  mail
     48272        2.3G  public_html

答案3

您可能还想看看“树”,最后一行列出了存在多少个文件和目录。

> tree | tail -1
4449 directories, 62681 files

它应该和“find”一样快。

相关内容