Удаление файла с помощью команды rm

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

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

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

Что я должен проверить перед выполнением rm -rf?

Ответ 1

Не используйте переключатель -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" или аналогичный.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Используйте 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) 

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

Ответ 6

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

from sh import rm

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

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