Вопрос: Как подсчитать файлы в каждом подкаталоге в linux из cli


Общее количество файлов было слишком велико на сервере, где я плачу за хостинг. Мне нужно было найти способ подсчитать количество файлов в каждой подпапке, чтобы я мог сосредоточить свое внимание в областях, где есть много файлов.

Я не мог найти ни одного ответа, который показывал бы мне, как делать то, что я пытался сделать, поэтому я подумал, что отправлю свой вопрос, а затем отвечу на него, чтобы другие могли его использовать.

Мой вопрос:

Как я могу перебирать подкаталоги в моем текущем каталоге и создавать список, который показывает количество рекурсивных файлов в каждом подкаталоге, отсортированное по количеству файлов?


0
2018-05-10 23:08


Источник




Ответы:


Я создал файл в моей домашней папке 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

1
2018-05-10 23:17





du --inodes ${topdir} 

будет перечислять количество inodes, используемых каждым каталогом (и его подкаталогами). Вы можете легко заметить самых крупных преступников:

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

1
2018-05-11 12:23



--inodes не поддерживается для du на моем уровне Linux (Ubuntu). - James L.
Это на моем Ubuntu 16.04 (du (GNU coreutils) 8.25) - xenoid