eth*_*201 6 linux shell bash python output
我可以使用以下命令来获取目录及其大小的列表,并将它们从大到小排序(在示例中,我将目录重命名为数字以使其更易于理解)。
$: 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
Run Code Online (Sandbox Code Playgroud)
我正在编写一个程序,需要从最大到最小输入这些目录,但为了方便起见,它需要将它们全部放在一行中。是否有一个命令可以让我在没有大小的情况下在一行上从最大到最小对目录进行排序?
我希望输出是这样的:
one two three four five six seven eight nine
Run Code Online (Sandbox Code Playgroud)
如果您确信目录名称不包含空格,那么很容易在一行中获取所有目录名称:
du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
Run Code Online (Sandbox Code Playgroud)
如果你想在 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()
Run Code Online (Sandbox Code Playgroud)
在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()
Run Code Online (Sandbox Code Playgroud)
我们还可以利用 python 的功能来减少 shell 完成的工作量,特别是消除以下需要awk:
subprocess.Popen("du -sk [a-z]*/ | sort -nr", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]
Run Code Online (Sandbox Code Playgroud)
我们可以更进一步,将输出du直接读取到 python 中,将大小转换为整数,然后按大小排序。sort -nr不过,在 shell 中执行此操作更简单。
如果当前目录中没有你想要的大小的目录,有两种可能:
du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
Run Code Online (Sandbox Code Playgroud)
并且:
cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
Run Code Online (Sandbox Code Playgroud)
两者之间的区别在于是否/some/path包含在输出中。