需要根据文件大小对文件进行排序,并且仅打印文件大小和文件名(无路径)。
我尝试使用以下命令来实现这一目标,
查找。型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
注意:我目录中的所有文件名都具有唯一名称,在我的情况下不会有重复的文件名。我不确定如何获得此结果。有人可以帮我吗?
答案 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
>