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

时间:2018-12-13 17:31:04

标签: linux bash shell sh

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

我尝试使用以下命令来实现这一目标,

  

查找。型f -exec du -h {} + |排序-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 个答案:

答案 0 :(得分:3)

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

printf

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

全部在manual page中。

抱歉,我知道这与find $PWD -printf "%10.10s\t%f\n" | sort -n 的输出不同,但是您可以跳过所有这些流程调用来节省大量时间。...

答案 1 :(得分:1)

您可以尝试使用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

因此,当您要保留第一列时,只需将正则表达式(.*\/)应用于第二列。该正则表达式可以匹配所有斜线(我使用\/,因为您需要转义/)。然后,我用''替换该正则表达式匹配项(基本上将其删除)。

答案 2 :(得分:1)

du命令输出\ t,因此可以在awk中使用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,

EDIT2

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

EDIT3

> 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
>