Оболочка: список каталогов, упорядоченный по количеству файлов (в том числе в подкаталогах) - PullRequest
10 голосов
/ 03 августа 2011

Я почти достиг предела разрешенного количества файлов в моем домашнем каталоге Linux, и мне любопытно, где находятся все файлы.

В любом каталоге я могу использовать, например, find . -type f | wc -l, чтобы показать количество файлов в этом каталоге и в его подкаталогах, но я хотел бы иметь возможность генерировать полный списоквсе подкаталоги (и подкаталоги и т. д.), каждый из которых содержит count всех содержащихся в нем файлов и его подкаталогов - если возможно, ранжируется по количеству по убыванию.

Напримересли моя структура файла выглядит следующим образом:

Home/
  file1.txt
  file2.txt
  Docs/
    file3.txt
    Notes/
      file4.txt
      file5.txt
    Queries/
      file6.txt
  Photos/
    file7.jpg

Вывод будет выглядеть примерно так:

7  Home
4  Home/Docs
2  Home/Docs/Notes
1  Home/Docs/Queries
1  Home/Photos

Любые предложения очень приветствуются.(Также быстрое объяснение ответа, поэтому я могу учиться на этом!).Спасибо.

Ответы [ 7 ]

25 голосов
/ 13 января 2014

Я использую следующую команду

find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

, которая производит что-то вроде:

[root@ip-***-***-***-*** /]# find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
      1 .autofsck
      1 stat-nginx-access
      1 stat-nginx-error
      2 tmp
     14 boot
     88 bin
    163 sbin
    291 lib64
    597 etc
    841 opt
   1169 root
   2900 lib
   7634 home
  42479 usr
  80964 var
8 голосов
/ 03 августа 2011

Это должно работать:

find ~ -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr

Пояснение: В приведенной выше команде будет запущен "find ~ -type d", чтобы найти все подкаталоги home-каталога. Для каждого из них он запускает короткий сценарий оболочки, который находит общее количество файлов в этом подкаталоге (используя уже известную вам команду «find $ dir -type f | wc -l»), и выводит число сопровождаемый именем каталога. Затем выполняется команда сортировки для сортировки по общему количеству файлов в порядке убывания.

Это не самое эффективное решение (вы сканируете один и тот же каталог много раз), но я не уверен, что вы можете добиться большего успеха с одним вкладышем: -)

3 голосов
/ 20 августа 2013

проще и эффективнее:

find ~ -type f -exec dirname {} \; | sort | uniq -c | sort -nr
3 голосов
/ 03 августа 2011
countFiles () {
    # call the recursive function, throw away stdout and send stderr to stdout
    # then sort numerically
    countFiles_rec "$1" 2>&1 >/dev/null | sort -nr
}

countFiles_rec () {
    local -i nfiles 
    dir="$1"

    # count the number of files in this directory only
    nfiles=$(find "$dir" -mindepth 1 -maxdepth 1 -type f -print | wc -l)

    # loop over the subdirectories of this directory
    while IFS= read -r subdir; do

        # invoke the recursive function for each one 
        # save the output in the positional parameters
        set -- $(countFiles_rec "$subdir")

        # accumulate the number of files found under the subdirectory
        (( nfiles += $1 ))

    done < <(find "$dir" -mindepth 1 -maxdepth 1 -type d -print)

    # print the number of files here, to both stdout and stderr
    printf "%d %s\n" $nfiles "$dir" | tee /dev/stderr
}


countFiles Home

производит

7 Home
4 Home/Docs
2 Home/Docs/Notes
1 Home/Photos
1 Home/Docs/Queries
1 голос
/ 06 июня 2017

См. Следующий пример: сортировка по столбцу 2 в обратном порядке. Используйте sort -k 2 -r. -k 2 означает сортировку по столбцу 2 (через пробел), -r означает обратный ход.

# ls -lF /mnt/sda1/var/lib/docker/165536.165536/aufs/mnt/ | sort -k 2 -r
total 972
drwxr-xr-x   65 165536   165536        4096 Jun  5 12:23 ad45ea3c6a03aa958adaa4d5ad6fc25d31778961266972a69291d3664e3f4d37/
drwxr-xr-x   19 165536   165536        4096 Jun  6 06:46 7fa7f957669da82a8750e432f034be6f0a9a7f5afc0a242bb00eb8024f77d683/
drwxr-xr-x    2 165536   165536        4096 May  8 02:20 49e067ffea226cfebc8b95410e90c4bad6a0e9bc711562dd5f98b7d755fe6efb/
drwxr-xr-x    2 165536   165536        4096 May  8 01:19 45ec026dd49c188c68b55dcf98fda27d1f9dd32f825035d94849b91c433b6dd3/
drwxr-xr-x    2 165536   165536        4096 Mar 13 06:08 0d6e95d4605ab34d1454de99e38af59a267960999f408f720d0299ef8d90046e/
drwxr-xr-x    2 165536   165536        4096 Mar 13 02:25 e9b252980cd573c78065e8bfe1d22f01b7ba761cc63d3dbad284f5d31379865a/
drwxr-xr-x    2 165536   165536        4096 Mar 13 02:24 f4aa333b9c208b18faf00b00da150b242a7a601693197c1f1ca78b9ab2403409/
drwxr-xr-x    2 165536   165536        4096 Mar 13 02:24 3946669d530695da2837b2b5ed43afa11addc25232b29cc085a19c769425b36b/
drwxr-xr-x    2 165536   165536        4096 Mar 11 11:11 44293f77f63806a58d9b97c3c9f7f1397b6f0935e236250e24c9af4a73b3e35b/
1 голос
/ 15 июня 2015
find . -type d -exec sh -c '(echo -n "{} "; ls {} | wc -l)' \; | sort -n -k 2

Это довольно эффективно.

Он будет отображать количество в порядке возрастания (то есть наибольшее в конце). Чтобы получить его в порядке убывания, добавьте опцию «-r» в «sort».

Если вы запустите эту команду в каталоге "/", она просканирует всю файловую систему и расскажет, какие каталоги содержат наибольшее количество файлов и подкаталогов. Это хороший способ узнать, где используются все ваши иноды.

Примечание: это не будет работать для каталогов, содержащих пробелы, но вы можете изменить его для работы в этом случае, если это проблема для вас.

0 голосов
/ 27 июня 2015

Если, тем не менее, вы согласны с неумулятивным решением, используя dirname (см. Ответ wjb), то гораздо более эффективным будет:

find ~ -type f -print0 | xargs -0 dirname | sort | uniq -c | sort -n

Обратите внимание, что это не отображает пустые каталоги. Для этого вы можете сделать find ~ -type d -empty если ваша версия find поддерживает это.

...