Удаление файла с помощью команды 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 и/или попросите пользователя ввести дополнительную осторожность.
И, да, курите человека, чтобы избежать рекурсивного удаления одного файла;)