Python可执行到Linux列表文件的大小

时间:2015-04-12 09:40:38

标签: python linux shell subprocess

我需要我的test.py在LINUX shell中显示以下内容 - 列出目录中的所有文件 - 文件大小的降序(以字节为单位)(必须显示字节) - 结束时显示总文件和总大小(X文件X总大小) - 不包括其他子目录中的子目录或文件

这是我的python可执行文件

    #!/usr/bin/env python
    import subprocess
    subprocess.call(["ls", "-l", "-S", "-s"])

这会以降序显示文件及其大小,但它包含我不想要的文件夹/子目录

另外用sub替换subprocess.call subprocess.call([“find”,“ - type”,“f”]) 只显示没有不需要的日期和时间的文件,但我不知道如何获得我想要的信息。

我的python代码:

#!/usr/bin/env python 
import subprocess, os, operator 
directory='e:\\Programs/Cyg/home/Dylan/test'       
list=os.listdir(directory) 
pairs=[] 
for file in list:
    if os.path.isfile: 
        location=os.path.join(directory, file)   
        size=os.path.getsize(location) pairs.append((file,size))  
pairs.sort(key=operator.itemgetter(0)) 
for pair in pairs:
   print (pair)

2 个答案:

答案 0 :(得分:2)

当前目录

from os import listdir
from os.path import isfile, getsize
from operator import itemgetter

files = [(f, getsize(f)) for f in listdir('.') if isfile(f)]
files.sort(key=itemgetter(1), reverse=True)

for f, size in files:
    print '%d %s' % (size, f)
print '(%d files %d total size)' % (len(files), sum(f[1] for f in files))

其他目录

from os import listdir
from operator import itemgetter
from os.path import isfile, getsize, join, basename

def listfiles(dir):
    paths = (join(dir, f) for f in listdir(dir))
    files = [(basename(p), getsize(p)) for p in paths if isfile(p)] 
    files.sort(key=itemgetter(1), reverse=True)

    for f, size in files:
        print '%d %s' % (size, f)
    print '(%d files %d total size)' % (len(files), sum(f[1] for f in files))

答案 1 :(得分:1)

您可以将输出通过管道输出到grep以忽略目录。

from subprocess import Popen,PIPE

directory = 'path' 

p1 = Popen(["ls",directory, "-Ssp"], stdout=PIPE)

p2 = Popen(["grep", "-v", '/$'], stdin=p1.stdout, stdout=PIPE)  

p1.stdout.close()
out, _err = p2.communicate()

files = out.splitlines()
total = files.pop(0)
print(total)
print(len(files))

在您自己的代码中,您使用错误的键进行排序,您需要将文件大小放在元组中,确保实际调用isfile

import  operator
from os import path, listdir

 directory = 'path' 

lst = listdir(directory)
pairs = []
for f in lst:
    if os.path.isfile(path.join(directory, f)):
        location = path.join(directory, f)
        size = os.path.getsize(location)
        pairs.append((size, f))

pairs.sort(key=operator.itemgetter(0),reverse=True)

print(len(pairs))
print(sum(s for s,_ in pairs))

for size, f in pairs:
    print(size, f)

要从最高到最低排序,您需要使用reverse=True。如果要忽略副本,可以使用if not f.endswith("~")或使用-B标记ls来忽略备份。要使用ls更改文件的输出大小,您需要使用--block-size 1

之类的内容