代码之家  ›  专栏  ›  技术社区  ›  Tom Taylor

根据文件大小对文件(包括子目录中的文件)进行排序,并打印文件名和大小

  •  1
  • Tom Taylor  · 技术社区  · 7 年前

    需要根据大小对文件进行排序,只打印大小和文件名(无路径)。

    找到-类型f-exec du-h{}+| sort-r-h

    但是这个打印的结果是这样的,

    6.0K ~/Documents/Folder/B/File2.txt
    
    6.0K ~/Documents/Folder/KK/KB/File12.txt 
    
    4.0K ~/Documents/Folder/A/File1.txt
    

    但我希望输出的文件名不带目录前缀,比如,

    6.0K File2.txt
    
    6.0K File12.txt
    
    4.0K File1.txt
    

    3 回复  |  直到 7 年前
        1
  •  3
  •   Paul Hodges    7 年前

    find printf 函数可以在执行搜索时报告文件大小,以及不带路径的名称。如果您愿意,它甚至可以进行各种格式设置以支持整洁的列。

    find $PWD -printf "%10.10s\t%f\n" | sort -n
    

    %s是字节数,%k将以KB为单位列出大小。

    一切都在计划之中 manual page .

    du -h ,抱歉,跳过所有这些进程调用可能会节省大量时间。。。。

        2
  •  1
  •   Joaquin    7 年前

    你可以试着用英语来完成它 awk :

    find . -type f -exec du -h {} + | sort -r -h | awk '{sub(".*\/","",$2)}1'
    

    /

    awk 在您的情况下,按空格分隔线:

    $1         $2    
    
    6.0K      ~/Documents/Folder/B/File2.txt
    
    6.0K      ~/Documents/Folder/KK/KB/File12.txt 
    
    4.0K      ~/Documents/Folder/A/File1.tx
    

    因此,由于要保留第一列,只需应用正则表达式即可( .*\/ )到第二列。这个正则表达式匹配到slash(我使用 \/ 因为你需要逃跑 / ).然后,我用 ''

        3
  •  1
  •   stack0114106    7 年前

    du命令以\t输出,因此可以使用2个分隔符( \t,/

    > find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { print $1,$NF } '
    4.0K sameer.pkg
    0 rem_col_rows.pl
    0 rem_col_rows.dat
    0 myfile
    >
    

    编辑:

    要获得csv。。。

    > find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { print $1,$NF } ' | tr ' ' ',' | tr '\n' ','
    4.0K,sameer.pkg,0,skip_lines.txt,0,rem_col_rows.pl,0,rem_col_rows.dat,0,paras.txt,0,myfile,0,foo.yaml2,0,foo.yaml,
    

    find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { print $1,$NF } ' | tr ' ' ',' | tr '\n' ',' | sed 's/,$//g' 
    

    编辑3

    > find . -type f -exec du -h {} + | sort -r -h | awk -F"[\t/]" ' { printf("%s,%s\n",$1,$NF) } '
    4.0K,sameer.pkg
    0,skip_lines.txt
    0,rem_col_rows.pl
    0,rem_col_rows.dat
    0,paras.txt
    0,myfile
    0,foo.yaml2
    0,foo.yaml
    >