Как я могу показать размеры файлов с запятыми при получении списка каталогов с помощью 'ls -l'? - PullRequest
8 голосов
/ 16 января 2009

Вы можете сделать 'ls -l', чтобы получить подробный список каталогов, подобный этому:

-rw-rw-rw-  1 alice themonkeys 1159995999 2008-08-20 07:01 foo.log
-rw-rw-rw-  1 bob   bob         244251992 2008-08-20 05:30 bar.txt

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

Какой хороший способ добавить запятые к размерам файлов в списке каталогов, например:

-rw-rw-rw-  1 alice themonkeys 1,159,995,999 2008-08-20 07:01 foo.log
-rw-rw-rw-  1 bob   bob          244,251,992 2008-08-20 05:30 bar.txt

Ответы [ 9 ]

10 голосов
/ 16 января 2009

Если интересует порядок величины, ls -lh делает что-то вроде этого:

-rw-r----- 1 alice themonkeys 626M 2007-02-05 01:15 foo.log
-rw-rw-r-- 1 bob   bob        699M 2007-03-12 23:14 bar.txt
8 голосов
/ 16 января 2009

Я не думаю, что у ls есть именно такая возможность. Если вы ищете удобочитаемость, ls -lh предоставит вам размеры файлов, которые людям будет легче разобрать.

-rw-rw-rw-  1 alice themonkeys 1.2G 2008-08-20 07:01 foo.log
-rw-rw-rw-  1 bob   bob        244M 2008-08-20 05:30 bar.txt
2 голосов
/ 24 марта 2016

Я только что обнаружил, что он встроен в GNU Core Utils и работает для ls и du!

ls -l --block-size="'1"
du --block-size="'1"

Он работает в Ubuntu, но, к сожалению, не в OSX. Подробнее о вариантах размера блока здесь

2 голосов
/ 15 мая 2014

Этот обычный скрипт sed должен работать:

ls -l | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'

Тем не менее, я согласен с предыдущим комментарием о том, что ls -lh, вероятно, является лучшим общим решением для желаемого эффекта.

1 голос
/ 21 октября 2014

Это на OS X, так что вам, возможно, придется немного подправить его под свой вкус Unix. Я создал такую ​​функцию в моем файле ~ / .bashrc. Хитрость заключается в использовании 'в строке формата awk printf для размера файла. Предостережение: awk несколько искажает «общую» первую строку, а также теряет окраску терминала. В противном случае, одним из его достоинств является то, что он старается максимально выровнять столбцы. Для меня это мгновенно дает визуальную оценку размера файла. С ключом -h все в порядке, но ваш мозг должен преобразовать эти Ks, Bs, Gs. Самым большим преимуществом решения, представленного ниже, является то, что вы можете передать его, чтобы сортировать и сортировать его понимали. Как, например, в «lc | sort -k5,5nr».

lc() {
    /bin/ls -l -GPT | /usr/bin/awk "{
        printf \"%-11s \", \$1;
        printf \"%3s \",   \$2;
        printf \"%-6s \",  \$3;
        printf \"%-6s \",  \$4;
        printf \"%'12d \", \$5;
        printf \"%3s \",   \$6;
        printf \"%2s \",   \$7;
        for (i=8; i<=NF; i++) {
            printf \"%s \", \$i
        };
        printf \"\n\";
    }"
}
1 голос
/ 01 октября 2013

Вот улучшение в commafy.pl, оно позволяет вам использовать ls с указанием размеров файлов или без них. Псевдоним ls до commafy.pl, чтобы использовать его.

#!/usr/bin/perl
# Does ls and adds commas to numbers if ls -l is used.

$largest_number_of_commas = 0;
$result = `ls -C @ARGV`;

# First line adds five spaces before file size
$result =~ s/(^[-lrwxds]{10,}\s*[^\s]+\s*[^\s]+\s*[^\s]+)/$1     /gm;
$result =~ s/(.{5} )(\d{4,}) /truncatePre($1,$2).commafy($2).' '/eg;

$remove_extra_spaces = 5 - $largest_number_of_commas;
$result =~ s/(^[-lrwxds]{10,}\s*[^\s]+\s*[^\s]+\s*[^\s]+) {$remove_extra_spaces}/$1/gm;
print $result;

# adds commas to an integer as appropriate
sub commafy
{
  my($num) = @_;
  my $len = length($num);
  if ($len <= 3) { return $num; }
  return commafy(substr($num, 0, $len - 3)) . ',' . substr($num, -3);
}

# removes as many chars from the end of str as there are commas to be added
# to num
sub truncatePre
{
  my($str, $num) = @_;
  $numCommas = int((length($num)-1) / 3);
  if ($numCommas > $largest_number_of_commas) {$largest_number_of_commas = $numCommas}
  return substr($str, 0, length($str) - $numCommas);
}
1 голос
/ 16 января 2009

На самом деле, я искал тест для молодого стажера, и это казалось идеальным. Вот что он придумал:

for i in $(ls -1)
do
    sz=$(expr $(ls -ld $i | awk '{print $5}' | wc -c) - 1)
    printf "%10d %s\n" $sz $i
done

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

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

1 голос
/ 16 января 2009

Вот скрипт perl, который отфильтрует вывод 'ls -l', чтобы добавить запятые. Если вы вызываете скрипт commafy.pl, вы можете использовать псевдоним 'ls' для 'ls -l | commafy.pl'.

#!/usr/bin/perl -p
# pipe the output of ls -l through this to add commas to numbers.

s/(.{5} )(\d{4,}) /truncatePre($1,$2).commafy($2).' '/e;


# adds commas to an integer as appropriate  
sub commafy
{
  my($num) = @_;
  my $len = length($num);
  if ($len <= 3) { return $num; }
  return commafy(substr($num, 0, $len - 3)) . ',' . substr($num, -3);
}

# removes as many chars from the end of str as there are commas to be added
#   to num
sub truncatePre
{
  my($str, $num) = @_;

  $numCommas = int((length($num)-1) / 3);

  return substr($str, 0, length($str) - $numCommas);
}
0 голосов
/ 11 сентября 2015

Я написал это несколько лет назад, работает на stdin;

Чтение стандартного ввода и вставка запятых в числа для удобства чтения в стандартный вывод. Пример;

$ ls -l testdatafile.1000M 
-rw-rw-r--+ 1 mkm  wheel  <b>1048576000</b> Apr 24 12:45 testdatafile.1000M

$ ls -l testdatafile.1000M  | commas
-rw-rw-r--+ 1 mkm  wheel  <b>1,048,576,000</b> Apr 24 12:45 testdatafile.1000M

https://github.com/mikemakuch/commas

...