Я хочу удостовериться, что я удаляю требуемые файлы. Я имею, кодируют что-то как
dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)
dir
и file
значения выбираются от базы данных. Как я могу удостовериться, что никогда не заканчиваю тем, что работал rm -rf /
?
Что вещи должны я проверять перед выполнением rm -rf
?
Не используйте переключатель -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 "или аналогичный.
Во-первых, я предлагаю вам использовать функции os.remove ()
и os.rmdir ()
для работы с такими вещами. У вас будет более переносимый код и меньше головной боли при проверке возврата команды.
Чтобы проверить, что вы действительно пытаетесь удалить (вы можете не захотеть просто отмечать "/"), вы можете использовать некоторые регулярные выражения в сгенерированном пути или просто добавить базовый путь ко всем путям, возвращаемым из вашей базы данных (в зависимости от что ты делаешь ...).
Существует модуль shutil
, который обеспечивает работу с файлами в стиле shell. Если вы хотите удалить каталог и все файлы и каталоги в нем, используйте shutil.rmtree
.
Однако он реализован на языке python, так что если вы удаляете огромное количество файлов, то использование rm может быть быстрее, но если в пути есть пробел, то он не сработает.
Используйте 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)
Если файлы защищены от записи, убедитесь, что у вас есть права на запись, прежде чем запускать это.
Вы можете рассмотреть возможность использования os.remove()
вместо этого, поскольку это гораздо менее опасно, чем то, что вы пытаетесь сделать.