Как получить распределение размеров файла?

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

Добавление {1 exch sub} settransfer поскольку первая команда в файле инвертировала бы цвета документа (включенные растровые изображения).

Для PDF → преобразование постскриптума, можно использовать pdftops от libpoppler (AFAIK, ghostscript pdf2ps генерирует субоптимальные результаты). К сожалению, это не будет сохранено при генерации PDF из теперь отрицаемого файла постскриптума.

Обратите внимание, что некоторые средства просмотра PDF имеют способность инвертировать цвета, такой как xpdf (который не инвертирует битовые массивы), и evince (который инвертирует все, по-видимому, неважно, формат (PDF, постскриптум, djvu...)

2
08.11.2012, 00:35
3 ответа

Перечислите файлы, извлеките размер в байтах из списка, отсортируйте его и считайте возникновение каждого размера:

find /my/directory -type f -exec ls -l {} + | cut -d' ' -f5 | sort -n | uniq -c
  • не ужасно эффективный
  • если существуют много много файлов, может быть лучше сохранить промежуточные результаты во временном файле, отсортировать его в другой временный файл, то "uniq" он
  • здесь я использую числовой вид, таким образом, вывод будет заказан возрастающим (хорошим) размером файла, но любой вид сделает, пока равные строки группируются
  • передайте результаты по каналу в awk '{ print $1 "," $2 }' заставить файл CSV использоваться в Вашем предпочтительном инструменте построения графика (даже spreasheet инструменты сделает),
5
27.01.2020, 21:51
  • 1
    я думаю, что Вы забыли -l опция к ls. Можно хотеть заменить \; с + сделать это более эффективным. –  Stéphane Chazelas 07.11.2012, 17:08

Вариант Luke404 с GNU находит:

find . -type f -printf '%s\n' | sort -n | uniq -c
3
27.01.2020, 21:51

Этот код Perl может помочь:

@files = grep {-f} glob "*"; #List files in the current directory   
%files;  
for(@files)  
{  
  chomp (my $size = \`du -h \"$_\"`);  
  $size=~ s/\s+.*//;  #Remove the file name from the output of du  
  $files{$size}++;  #  Add an entry to the hash  
}  
print "Size,Count\n"; # Print a header  
print "${\_},$files{$_}\n" for(keys %files); # Print info in CSV format  

Отметьте следующее:

  • Этот код не пытается отсортировать файлы по размеру (этому, вероятно, была бы нужна подпрограмма отдельно),
  • Я использую du вместо -s оператор Perl, чтобы иметь человекочитаемый вывод.
  • Если Вы хотите перечислить содержание каталога кроме текущего, замены glob "*" glob "$ARGV[0]/*" и предоставьте название своего необходимого каталога как параметр командной строки.
  • Если Вы хотите перечислить содержание нескольких каталогов в пакетном задании, можно сохранить этот код как list_dir.pl и имейте обертку удара, которая делает что-то вроде этого:

    list_dir.pl dir1 > dir1_list.csv  
    list_dir.pl dir2 > dir2_list.csv
    
  • С другой стороны, код может быть далее изменен, чтобы принять несколько каталогов как аргументы и разветвить процесс для каждого каталога, который он ищет.

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

1
27.01.2020, 21:51

Теги

Похожие вопросы