通配符如果我有,我要刪除所有,但一個文件的目錄,我可能會在bash做到這一點:慶典在子
cd /tmp/a
rm -rf !(specialfile)
cd -
翻譯這最明顯的Python代碼失敗對我來說:
>>> subprocess.Popen('cd /tmp/a; rm -rf !(specialfile); cd -', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
此消息:
在Python退而求其次似乎是:
p = '/tmp/a'
for i in os.listdir(p):
if i != 'specialfile':
os.remove(os.path.join(p, i))
但當然這並不能很好地處理文件和子目錄。有沒有更好的辦法?
你嘗試過:'subprocess.Popen( '的bash -c 「!CD的/ tmp/A;室射頻(specialfile)」',標準輸出= subprocess.PIPE,標準錯誤= subprocess.PIPE,殼= True).communicate()',理由是'shell = True'調用'/ bin/sh'不是bash(根據系統的不同,可能會也可能不同)。 – isedev
看看:['os.walk'](http://docs.python.org/2/library/os.html#os.walk)。另外,從['Popen'](http://docs.python.org/2/library/subprocess.html#subprocess.Popen)的文檔中閱讀,您可以傳遞'executable'參數來指定應該是使用,這應該解決你的第一次嘗試。 – Bakuriu
個人而言,我更喜歡「下一個最好的東西」 - 產生一個bash只是爲了清理層次結構似乎過分。要處理目錄,可以使用shutil.rmtree()。 – dstromberg