我可以使用以下命令获取目录及其大小的列表,并从最大到最小对它们进行排序(在示例中,我将目录重命名为数字,以便更容易理解)。
$: du -sk [a-z]* 2>/dev/null | sort -nr
413096 one
106572 two
97452 three
76428 four
55052 five
45068 six
33680 seven
23220 eight
17716 nine
我正在编写一个程序,需要从最大到最小输入这些目录,但为了方便起见,它需要将它们全部放在一行上。是否有一个命令可以让我在一行中将目录从最大到最小排序而不显示大小?
我希望输出是这样的:
one two three four five six seven eight nine
答案1
如果您确信目录名称不包含空格,那么很容易在一行中获取所有目录名称:
du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
将信息输入python
如果你想在 python 程序中捕获该输出并将其放入列表中。使用 python2.7 或更高版本:
import subprocess
dir_list = subprocess.check_output("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True).split()
在python2.6中:
import subprocess
subprocess.Popen("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True, stdout=subprocess.PIPE).communicate()[0].split()
我们还可以利用 python 的功能来减少 shell 完成的工作量,特别是消除以下需要awk
:
subprocess.Popen("du -sk [a-z]*/ | sort -nr", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]
我们可以更进一步,将du
输出直接读取到 python 中,将大小转换为整数,然后按大小排序。不过,sort -nr
在 shell 中执行此操作更简单。
指定目录
如果当前目录中没有你想要的大小的目录,有两种可能:
du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
并且:
cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
两者之间的区别在于是否/some/path
包含在输出中。
答案2
使用paste
du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -
答案3
zsh
能够使用通配限定符对其通配符进行排序。您还可以使用函数定义自己的全局限定符。例如:
zdu() REPLY=$(du -s -- "$REPLY")
print -r -- [[:alpha:]]*(/nO+zdu)
/
将使用该函数以数字 (n) 反向排序 (O) 打印名称以字母开头的目录 ( )(顺便说一句,[a-z]
仅在 C 语言环境中有意义)zdu
。
请注意,当您这样做时:
du -s a b
如果a
和b
包含指向相同文件的硬链接,则将计算它们的磁盘使用量,a
但不计算b
.这里的方法zsh
避免了这种情况。
如果您要使用 python,我会从那里执行相同的操作:调用du -s
每个文件,然后对该列表进行排序。请记住,文件名可以包含任何字符,包括空格、制表符和换行符。
答案4
我相信该du
命令用于\t
分隔大小和目录路径,因此您只需要传递一些额外的参数awk
:
du -sk [a-z]* 2>/dev/null | sort -nr | awk -F'\t' -v ORS=" " '{print $2}'
万一您的目录路径也包含制表符,您可以先删除大小前缀:
du -sk [a-z]* 2>/dev/null | sort -nr | awk -v ORS=" " '{sub(/^[0-9]*\t/,"");print}'