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

Linux 根据文件大小对文件(包括子目录中的文件)进行排序,并打印文件名和大小,linux,bash,shell,sh,Linux,Bash,Shell,Sh,需要根据大小对文件进行排序,只打印大小和文件名(无路径) 我试着用下面的命令来达到这个目的 找到-类型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 Fi

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

我试着用下面的命令来达到这个目的

找到-类型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

注意:我的目录中的所有文件名都具有唯一的名称,在我的情况下不会有任何重复的文件名。我不知道怎样才能达到这个结果。有人能帮我吗?

你可以试着用
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

因此,当您想要保留第一列时,只需将正则表达式(
*\/
)应用于第二列即可。正则表达式匹配到斜杠的所有内容(我使用
\/
,因为您需要转义
/
)。然后,我将regex匹配替换为
(基本上删除它)。

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

因此,当您想要保留第一列时,只需将正则表达式(
*\/
)应用于第二列即可。正则表达式匹配到斜杠的所有内容(我使用
\/
,因为您需要转义
/
)。然后,我将regex匹配替换为
(基本上删除它)。

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

find $PWD -printf "%10.10s\t%f\n" | sort -n
%s是字节数,%k将以KB为单位列出大小

一切都在计划之中


我知道这与
du-h
的输出不同,很抱歉,但是您可以通过跳过所有这些进程调用来节省大量时间。

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

find $PWD -printf "%10.10s\t%f\n" | sort -n
%s是字节数,%k将以KB为单位列出大小

一切都在计划之中


我知道这与
du-h的输出不一样,很抱歉,但是您可以通过跳过所有那些进程调用来节省大量时间….

du命令输出带有\t,因此您可以在awk中使用2个分隔符(
\t,/

编辑:

要获得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,
编辑2

编辑3


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

编辑:

要获得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,
编辑2

编辑3



-r
是反向排序,但与我看到的输出不匹配。另外,您是否需要人类可读的格式,或者可能是字节?谢谢您指出@PaulHodges。结果是按降序排列的,但在这里写的时候,我犯了一个错误,按升序排列。我需要输出为人类可读的格式…
-r
是反向排序,但这与我看到的输出不匹配。另外,您是否需要人类可读的格式,或者可能是字节?谢谢您指出@PaulHodges。结果是按降序排列的,但在这里写的时候,我犯了一个错误,按升序排列。我需要输出为
h
uman可读格式…它在
linux
机器上运行良好。但当我尝试使用mac时,它会说,
find:-printf:unknown primary或operator
。关于如何克服这个问题有什么建议吗?检查你的版本。您可能能够?它在
linux
机器上运行良好。但当我尝试使用mac时,它会说,
find:-printf:unknown primary或operator
。关于如何克服这个问题有什么建议吗?检查你的版本。您可能可以?是否有任何方法可以打印输出,例如,
4.0K,sameer.pkg
0,rem\u col\u rows.pl
-这样也可以将其导出为csv..是。。只需使用
tr
命令将其导入管道,并将
\n
转换为commacheck my EDIT to the answer。使用编辑,整个结果将作为单个文件中的输出。如何在不丢失上一个结果中获得的新行字符的情况下打印?请检查我的编辑3。。我刚刚粘贴了我得到的输出。。您可以使用awk本身完成。是否有任何方法可以打印输出,例如,
4.0K,sameer.pkg
0,rem\u col\u rows.pl
-这样也可以将其导出为csv。是的。。只需使用
tr
命令将其导入管道,并将
\n
转换为commacheck my EDIT to the answer。使用编辑,整个结果将作为单个文件中的输出。如何在不丢失上一个结果中获得的新行字符的情况下打印?请检查我的编辑3。。我刚刚粘贴了我得到的输出。。你可以用awk本身来做。删除(替换为
'
)绝对路径,除了最后一部分。明白了!谢谢:)最后
1
awk{}1
中做了什么?我用它来打印行删除(替换为
'
)绝对路径,除了最后一部分。明白了!谢谢:)最后
1
awk{}1
中做了什么?我用它来打印行