2010-02-16 4 views
10

Desidero assicurarmi di eliminare i file richiesti. Ho codice qualcosa comeCancellazione file tramite comando rm

dir="/some/path/" 
file = "somefile.txt" 
cmd_rm= "rm -rf "+dir + file 
os.system(cmd_rm) 

I dir e file valori vengono recuperati da un database. Come posso assicurarmi di non finire mai in esecuzione rm -rf /?

Quali cose devo controllare prima di fare rm -rf?

+0

Penso che tu abbia bisogno di chiarire esattamente quello che stai chiedendo. Cosa stai cercando di fare esattamente? – benno

risposta

25

Non utilizzare lo switch -r se si desidera rimuovere un singolo file. Inoltre, potrebbero esserci degli spazi nel nome del file.

Meglio utilizzare le funzioni nel modulo di Python os invece:

dirname = "/some/path/" 
filename = "somefile.txt" 
pathname = os.path.abspath(os.path.join(dirname, filename)) 
if pathname.startswith(dirname): 
    os.remove(pathname) 

normalizzare il percorso con abspath e nel confronto con la directory di destinazione evita i nomi di file come" ../../../etc/passwd " o simili.

15

Si potrebbe considerare l'utilizzo di os.remove() invece poiché è molto meno pericoloso di quello che si sta tentando.

6

Innanzitutto, ti suggerisco di utilizzare le funzioni os.remove() e os.rmdir() per lavorare con cose del genere. Finirai con un codice più portatile e meno mal di testa per il controllo del ritorno dei comandi.

Per verificare che cosa si sta tentando di rimuovere (potrebbe non essere sufficiente selezionare "/"), è possibile utilizzare alcune espressioni regolari sul percorso generato o semplicemente aggiungere un percorso di base a tutto il percorso restituito dal database (dipende da cosa stai facendo ...).

+0

Se si desidera verificare il percorso con un'espressione regolare, non dimenticare di fare qualcosa come os.path.realpath e/o os.path.normpath per ottenere una stringa di percorso canonica e facile da gestire (in particolare, senza os.path.realpath() (o codice equivalente che semplicemente non può essere fatto con regex), non si ha modo di sapere che "foo/bar" si riferisce effettivamente a "/") –

2

C'è un modulo chiamato shutil che fornisce una manipolazione di file simile a shell. Se si desidera eliminare una directory e tutti i file e le directory in essa contenuti, utilizzare shutil.rmtree.

Tuttavia è implementato in python, quindi se si sta eliminando un numero enorme di file, lo spawning rm potrebbe essere più veloce, ma fallirà se il percorso contiene uno spazio.

+5

Voglio votare per il suggerimento shutil (http://docs.python.org/library/shutil.html, per un link), ma allo stesso tempo spawning rm non ha bisogno di fallire a causa di spazi ecc. (usa il sottoprocesso module, man!), e la velocità non è quasi certamente un problema (francamente, Python non è così lento, e sono abbastanza sicuro che questo op non è in genere legato alla CPU). –

2

Utilizzare shutil.rmtree come dice Dave Kirby. Se si desidera eliminare il proprio l'uso del file:

dir = "/some/path/" 
file = "somefile.txt" 
cmd = os.path.join(dir, file) 
shutil.rmtree(cmd) 

Se si desidera eliminare l'uso di directory:

dir = "/some/path/" 
file = "somefile.txt" 
shutil.rmtree(dir) 

Se i file sono protetti da scrittura assicurarsi di avere i permessi di scrittura prima di eseguire questo .

+0

Hmmm, ho avuto un errore nel provare rmtree con un file (anche se funziona bene con una directory). 'OSError: [Errno 20] Not a directory' – Pat

+0

@Pat - come stai eseguendo il tuo script,' python script.py' o 'python./Script.py'? – chrissygormley

+0

Tipicamente qualcosa come 'python script.py' o anche'./Script.py', ma in questo caso lo stavo effettivamente facendo in REPL ipython. – Pat

0

Supponendo che la tua menzione rm -rf non sia solo casuale, ma è esattamente il comando di cui hai bisogno, perché non chiamarlo semplicemente? C'è una lib che consente una maggiore integrazione con la shell chiamata sh.

from sh import rm 

path_to_delete = '/some/path' 
if os.path.exists(path_to_delete): 
    rm('-rf', path_to_delete) 

PS Accertarsi che non si sia root e/o chiedere l'input dell'utente per essere più cauti. E, sì, fuma l'uomo per evitare di cancellare un singolo file in modo ricorsivo;)