2017-09-20 21 views
0

「保存」期間の日付と一致しないフォルダ内のファイルを削除するには、以下のスクリプトを作成してください。例えば。この名前に部分一致するファイルをすべて削除します。Pythonサブプロセススクリプトが失敗する

このコマンドはシェルからは機能しますが、サブプロセス呼び出しでは失敗します。

/bin/rm /home/backups/!(*"20170920"*|*"20170919"*|*"20170918"*|*"20170917"*|*"20170916"*|*"20170915"*|*"20170914"*) 
#!/usr/bin/env python 
from datetime import datetime 
from datetime import timedelta 
import subprocess 

### Editable Variables 
keepdays=7 
location="/home/backups" 

count=0 
date_string='' 
for count in range(0,keepdays): 
    if(date_string!=""): 
     date_string+="|" 
    keepdate = (datetime.now() - timedelta(days=count)).strftime("%Y%m%d") 
    date_string+="*\""+keepdate+"\"*" 

full_cmd="/bin/rm "+location+"/!("+date_string+")" 
subprocess.call([full_cmd], shell=True) 

これはスクリプトが返すものです:

#./test.py 

/bin/rm /home/backups/!(*"20170920"*|*"20170919"*|*"20170918"*|*"20170917"*|*"20170916"*|*"20170915"*|*"20170914"*) 
/bin/sh: 1: Syntax error: "(" unexpected 

Pythonのバージョンは@hjpotterがサブプロセスとして/bin/sh使用する、と述べたのと同様のPython 2.7.12

+0

シェル/ターミナルからコマンドを実行しているときに、bashのグロブの展開やその他の置換を使用している場合。しかし、Pythonはコードを実行するために '/ bin/sh'('/bin/bash'ではなく)に依存しています。 – hjpotter92

答えて

0

ですあなたがやりたいグロビングの種類をサポートしていないデフォルトのシェルです。 official documentationを参照してください。あなたが(例えば/bin/bashまたは/bin/zsh)より適切なシェルでsubprocess.call()executableパラメータを使用していることを変更することができます。subprocess.call([full_cmd], executable="/bin/bash", shell=True)

いますが、多くの方のPython自体がサービスを提供することができ、あなたはにサブプロセスを呼び出す必要はありませんファイルを削除する:

#!/usr/bin/env python 
from datetime import datetime 
from datetime import timedelta 
import re 
import os 
import os.path 

### Editable Variables 
keepdays=7 
location="/home/backups" 

now = datetime.now() 
keeppatterns = set((now - timedelta(days=count)).strftime("%Y%m%d") for count in range(0, keepdays)) 

for filename in os.listdir(location): 
    dates = set(re.findall(r"\d{8}", filename)) 
    if not dates or dates.isdisjoint(keeppatterns): 
     abs_path = os.path.join(location, filename) 
     print("I am about to remove", abs_path) 
     # uncomment the line below when you are sure it won't delete any valuable file 
     #os.path.delete(abs_path) 
+0

返事をありがとう。 エラーを投げたサブプロセスで実行可能なargを試しましたが、置き換えスクリプトは完全に機能しました! – Jemson

関連する問題