список папок по количеству файлов рекурсивно

5

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

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

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

Lie Ryan
источник
Примечание для тех, кто отвечает на этот вопрос: Lie действительно ищет файловый менеджер / браузер, приложение с графическим интерфейсом, а не скрипт, как большинство людей думают, читая вопрос
CarlF
Обычный трюк для копирования большого количества маленьких файлов - это не копировать их как много, а как один. Например, используя tar или cpio, например: tar cf - | ssh myotherbox tar xvf -
Konrads
@Konrads: я копирую на / с внешнего жесткого диска на свой локальный диск.
Lie Ryan
С наилучшими пожеланиями в будущем: если вы используете какую-то облачную синхронизацию (например, Dropbox), Baobab с количеством файлов вместо размера файла будет аккуратным. Я думаю, что я опубликую запрос на функцию там. // Или я смелый и закодирую эту функцию сам.
phresnel

Ответы:

2

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

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

& Амп; ss#1

Ray
источник
JDiscReport выполняет свою работу, по умолчанию указывается размер файла, но если вы выберете «Просмотр & gt; Показать количество файлов», он будет отображаться по количеству файлов.
Lie Ryan
6

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

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

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
harrymc
источник
Я не возражаю против инструмента командной строки, но я бы предпочел, чтобы этот инструмент позволял мне просматривать дерево каталогов, поэтому, если я начну с /, у которого всего 10000 папок / файлов, то я могу перейти к / usr / 1000 папки / файлы и т. д. без пересчета подкаталогов.
Lie Ryan
Тогда вы ищете инструмент, а не сценарий.
harrymc
Фантастика! Работал на Android через оболочку, где другие потерпели неудачу.
Kevin Parker
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 :(

bfhd
источник
Я не возражаю против инструмента командной строки, но я бы предпочел, чтобы этот инструмент позволял мне просматривать дерево каталогов, поэтому, если я начну с /, у которого всего 10000 папок / файлов, то я могу перейти к / usr / 1000 папка / файлы и т. д.
Lie Ryan
1
Замены должны быть указаны, как показано ниже. Если нет, у вас возникнут проблемы с каталогами, содержащими пробелы и т. Д .: ls -A "$ DIR" | echo "$ DIR" $ (wc -w); сделано
jonathan
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. Сортировать список каталогов, отсортировав второе поле (поля, разделенные двоеточием) по номерам. Таким образом, представьте каталоги с наибольшим количеством файлов, последних в выводе.

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

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

Chris Poole
источник
Можете ли вы рассказать нам, как работает эта команда?
Tom Wijsman
@ Том: да, это была бы хорошая идея. Я отредактировал свой ответ.
Chris Poole
2
я получил bash: syntax error near unexpected token ; ''
Adam Parkin
2
@AdamParkin убери точку с запятой после do
tjmcewan
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
bryan
источник