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

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

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

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

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

13
задан Brian Tompsett - 汤莱恩 6 July 2015 в 11:43
поделиться

5 ответов

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

27
ответ дан 1 December 2019 в 17:33
поделиться

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

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

6
ответ дан 1 December 2019 в 17:33
поделиться

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

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

2
ответ дан 1 December 2019 в 17:33
поделиться

Используйте 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
ответ дан 1 December 2019 в 17:33
поделиться

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

15
ответ дан 1 December 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: