5

Есть ли приложение для Linux для поиска папок с наибольшим количеством файлов?

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

Причина, по которой я смотрю, заключается в том, что копирование десятков тысяч небольших файлов мучительно медленно (намного медленнее, чем копирование нескольких больших файлов одинакового размера), поэтому я хочу заархивировать или удалить эти папки с большим количеством файлов, что это будет замедление копирования (сейчас это не ускорится, но будет быстрее, когда мне потребуется переместить / скопировать его в будущем).

5 ответов5

6

From Shell: список каталогов, упорядоченный по количеству файлов (объяснения см. В статье):

Однострочник (для домашнего каталога):

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

Сценарий :

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
5

Я был уверен, что есть способ сделать это с помощью сценария, поэтому я пошел и понял это.

Если вы создадите скрипт bash следующим образом (скажем, мы назвали его «countfiles»):

#!/bin/bash
find . -type d | while read DIR; do
ls -A $DIR | echo $DIR $(wc -w);done

затем запустите его и передайте вывод так:

./countfiles | sort -n -k 2,2 > output

Тогда ваш выходной файл будет иметь все подкаталоги, перечисленные с количеством файлов сразу после него (наибольшее количество файлов в конце).

например. запуск этого скрипта, как указано выше в моей папке /usr, показывает это, когда я выполняю 'tail output'

./lib/gconv 249
./share/doc 273
./share/i18n/locales 289
./share/mime/application 325
./share/man/man8 328
./share/perl/5.10.1/unicore/lib/gc_sc 393
./lib/python2.6 424
./share/vim/vim72/syntax 529
./bin 533
./share/man/man1 711

Вероятно, есть лучший способ сделать это; Я не очень хорош в скриптах bash :(

2

Попробуйте JDiskReport, это может быть работоспособным для вас. FileLight - это еще один вариант , если вы запускаете KDE.

Снимок экрана JDiskReport

& сс # 1

1

Попробуй это:

find . -type d | while read dir; do; echo "$dir" : $(find "$dir" -type f | wc -l); done | sort -k2 -t ':' -n 

Вот что он делает:

  1. Получить список всех каталогов (и любых подкаталогов) в текущем каталоге.
  2. Для каждого каталога, найденного в (1), определите, сколько файлов находится в этом каталоге (и, опять же, в любых подкаталогах), перечислив файлы и затем подсчитав количество выведенных строк.
  3. Для каждого каталога, найденного в (1), выведите его путь (относительно того, где вы сейчас находитесь), а также количество найденных в нем файлов, определенное в (2). Поместите двоеточие между ними.
  4. Сортировать список каталогов, отсортировав второе поле (поля, разделенные двоеточием) по номерам. Таким образом, представьте каталоги с наибольшим количеством файлов, последних в выводе.

Текущий каталог, представленный . , появится последним, так как это корневой узел в дереве.

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

0

Попробуйте эти две альтернативы -

1) Для подробного вывода дерева -

 for i in $(ls -d */); do tree  $i ; done > results.txt

Выход -

c++/
|-- 4.4
|   |-- algorithm
|   |-- array
|   |-- backward
|   |   |-- auto_ptr.h
|   |   |-- backward_warning.h
|   |   |-- binders.h
|   |   |-- hash_fun.h
|   |   |-- hash_map
|   |   |-- hash_set
|   |   |-- hashtable.h
|   |   `-- strstream
|   |-- bits
|   |   |-- algorithmfwd.h
...
38 directories, 662 files


2) Для краткого изложения дерева используйте -

for i in $(ls -d */); do tree $i | grep -v \\-\\-\  ; done

Выход -

arpa/

0 directories, 6 files

asm/

0 directories, 56 files

asm-generic/

0 directories, 34 files

bits/

0 directories, 103 files

c++/

38 directories, 662 files

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .