English 中文(简体)
如何在使用ls -l获取一个目录列表时,在文件大小中插入逗号?
原标题:
  • 时间:2009-01-16 08:10:14
  •  标签:

您可以执行 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
最佳回答

我认为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
问题回答

我刚刚发现它已经内置在GNU Core Utils中,并且适用于ls和du!

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

它在Ubuntu上工作,但遗憾的是在OSX上不工作。更多关于块大小变体的信息在这里

如果您只关心数量级,则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

这是对 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);
}

这个常见的sed脚本应该可以工作:

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

然而,我同意之前的评论建议使用ls -lh可能是实现所需效果的更好的一般解决方案。

这是在OS X上,因此您可能需要为您的Unix版本进行一些微调。我在我的~/.bashrc点文件中为此目的创建了这样的函数。诀窍是在awk printf格式字符串中使用“\t”以获取文件大小。一个注意事项:awk会在某种程度上搞乱“总计”第一行,并且也会丢失终端着色。否则,它的优点之一是尽可能保持列对齐。对我来说,这立即给出了文件的大致大小视觉估计。-h开关解决方案也可以,但你的大脑需要将那些K、B、G转换。以下解决方案的最大优势是您可以将其管道到排序,并且排序会理解它。比如“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 "
";
    }"
}

Here s a perl script that will filter the output of ls -l to add the commas. If you call the script commafy.pl then you can alias ls to 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);
}

实际上,我正在寻找一项适用于年轻实习生的测试,这似乎非常理想。以下是他提交的测试:

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

它以一种非常低效的方式给出了尺寸的数量级。我将把它设为社区维基,因为我们都对您如何评价他的代码感兴趣,但我不希望我的声望受到损害。

随意留下评论(温柔点,他是新手,尽管他的shell脚本看不出来 :-)。)

我几年前写的,适用于标准输入(stdin);

Read stdin & insert commas in numbers for readability emit to stdout. example;

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

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

将此翻译成中文:https://github.com/mikemakuch/commas https://github.com/mikemakuch/commas

export LS_BLOCK_SIZE=" 1"

将为GNU ls的最新版本执行此操作。





相关问题
热门标签