Глазное яблоко, вы можете заставить СВОЙ сценарий работать следующим образом:
1) Удалить строку filename=filename.replace(' ', '\ ')
Экранирование более сложное, чем это, и вы должны просто заключить в кавычки полный путь или использовать библиотеку Python, чтобы экранировать его в зависимости от конкретной ОС;
2) Возможно, вам не хватает разделителя между путем и именем файла;
3) Вам нужны одинарные кавычки вокруг полного пути в вызове os.system.
Это работает для меня:
#!/usr/bin/python
import os
folderpath='/Users/andrew/bin'
file=open('ft.txt','r')
for line in file:
filename=line.strip()
fullpath=folderpath+"/"+filename
os.system('du -h '+"'"+fullpath+"'")
Файл "ft.txt" имеет имена файлов без пути, а часть пути - '/Users/andrew/bin'
. У некоторых файлов есть имена, которые нужно экранировать, но это делается с помощью одинарных кавычек вокруг имени файла.
Это будет запускать du -h
для каждого файла в текстовом файле .txt, но не даст вам общее количество. Это довольно просто в Perl или Python.
Вот скрипт Python (основанный на вашем), чтобы сделать это:
#!/usr/bin/python
import os
folderpath='/Users/andrew/bin/testdir'
file=open('/Users/andrew/bin/testdir/ft.txt','r')
blocks=0
i=0
template='%d total files in %d blocks using %d KB\n'
for line in file:
i+=1
filename=line.strip()
fullpath=folderpath+"/"+filename
if(os.path.exists(fullpath)):
info=os.stat(fullpath)
blocks+=info.st_blocks
print `info.st_blocks`+"\t"+fullpath
else:
print '"'+fullpath+"'"+" not found"
print `blocks`+"\tTotal"
print " "+template % (i,blocks,blocks*512/1024)
Обратите внимание, что на этот раз вам не нужно цитировать или экранировать имя файла; Python делает это для вас. Это вычисляет размеры файла, используя блоки выделения; так же, как это делает du . Если я запускаю du -ahc
для тех же файлов, которые я перечислил в ft.txt
, я получаю тот же номер (ну, вроде; du
сообщает о нем как 25M
, и я получаю отчет как 24324 KB
), но он сообщает такое же количество блоков. (Примечание: в Unix всегда предполагается, что «блоки» составляют 512 байт, хотя фактический размер блока на диске большего размера всегда больше.)
Наконец, вы можете рассмотреть возможность создания своего сценария, чтобы он мог читать группу файлов командной строки, а не жестко кодировать файл и путь в сценарии. Рассмотрим:
#!/usr/bin/python
import os, sys
total_blocks=0
total_files=0
template='%d total files in %d blocks using %d KB\n'
print
for arg in sys.argv[1:]:
print "processing: "+arg
blocks=0
i=0
file=open(arg,'r')
for line in file:
abspath=os.path.abspath(arg)
folderpath=os.path.dirname(abspath)
i+=1
filename=line.strip()
fullpath=folderpath+"/"+filename
if(os.path.exists(fullpath)):
info=os.stat(fullpath)
blocks+=info.st_blocks
print `info.st_blocks`+"\t"+fullpath
else:
print '"'+fullpath+"'"+" not found"
print "\t"+template % (i,blocks,blocks*512/1024)
total_blocks+=blocks
total_files+=i
print template % (total_files,total_blocks,total_blocks*512/1024)
Затем вы можете выполнить скрипт (после chmod +x [script_name].py
) на ./script.py ft.txt
, и он будет использовать путь к файлу командной строки в качестве предполагаемого пути к файлам "ft.txt". Вы также можете обрабатывать несколько файлов.