Удаление файла с помощью команды rm - PullRequest
11 голосов
/ 16 февраля 2010

Я хочу убедиться, что я удаляю необходимые файлы. У меня есть код что-то вроде

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

Значения dir и file извлекаются из базы данных. Как я могу убедиться, что я никогда не запустил rm -rf /?

Какие вещи я должен проверить перед выполнением rm -rf?

Ответы [ 6 ]

26 голосов
/ 16 февраля 2010

Не используйте переключатель -r, если вы просто хотите удалить один файл. Кроме того, в имени файла могут быть пробелы.

Лучше использовать функции в модуле Python os вместо:

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

Нормализация пути с помощью abspath и сравнение его с целевым каталогом позволяет избежать имен файлов, таких как "../../../etc/passwd" или подобных.

15 голосов
/ 16 февраля 2010

Вместо этого вы можете использовать os.remove(), поскольку это намного менее опасно, чем то, что вы пытаетесь.

6 голосов
/ 16 февраля 2010

Во-первых, я предлагаю вам использовать функции os.remove() и os.rmdir() для работы с такими вещами. В результате вы получите более переносимый код и меньше головной боли для проверки возврата команды.

Чтобы проверить, что вы действительно пытаетесь удалить (вы можете не захотеть просто проверять "/"), вы можете использовать некоторые регулярные выражения в сгенерированном пути или просто добавить базовый путь ко всем путям, возвращаемым из вашей базы данных (в зависимости от что ты делаешь ...).

2 голосов
/ 16 февраля 2010

Используйте shutil.rmtree, как говорит Дейв Кирби. Если вы хотите удалить только файл, используйте:

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

Если вы хотите удалить каталог, используйте:

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

Если файлы защищены от записи, перед запуском убедитесь, что у вас есть права на запись.

2 голосов
/ 16 февраля 2010

Существует модуль с именем shutil, который обеспечивает манипулирование файлами в виде оболочки. Если вы хотите удалить каталог и все файлы и каталоги в нем, используйте shutil.rmtree.

Однако это реализовано в python, поэтому, если вы удаляете огромное количество файлов, порождение rm может быть быстрее, но не удастся, если в пути есть пробел.

0 голосов
/ 05 марта 2013

Предполагая, что ваше упоминание rm -rf не просто случайно, а именно та команда, которая вам нужна, почему бы просто не вызвать ее? Существует библиотека, позволяющая большую интеграцию с оболочкой, которая называется sh .

from sh import rm

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

PS Убедитесь, что вы не являетесь пользователем root и / или попросите пользователя быть более осторожным. И, да, покурите человека, чтобы избежать рекурсивного удаления одного файла;)

...