Linux: безопасное рекурсивное удаление в скриптах

333
lennelei

Я работаю над автоматизированными скриптами, работающими на Linux-коробке (Debian). Эти сценарии запускаются из планировщика и управляют файлами в своих собственных каталогах.

В конце скриптов мне нужно удалить временные файлы.

В настоящее время у меня есть что-то вроде этого:

#check that some variables are not empty if [[ -z $var1 || -z $var2 || -z $var3 ]]; then echo "Some var is empty" exit 1 fi workingdir=$var1/$var2 #some checks on working directory if [[ ! -d $workingdir ]]; then echo "Directory error" exit 1 fi cd $workingdir if [[ $(pwd) != $workingdir ]]; then echo "Change directory error" exit 1 fi #...here goes the main part of the script #and at the end, the "cleaning" if [[ -d $workingdir/temp/$var3 ]]; then find $workingdir/temp/$var3 -delete; fi 

Есть ли у вас какие-либо идеи, которые я мог бы использовать, чтобы уменьшить риск удаления что-то не так?

Спасибо.

С уважением

0
Первое: [`" двойные кавычки $ variable "`] (https://mywiki.wooledge.org/Quotes#When_Should_You_Quote.3F). Kamil Maciorowski 6 лет назад 1
Спасибо за эту ссылку. Я долго искал, и я не уверен, как заключить двойную кавычку в цикл for / с подстановочным знаком? Должен ли я использовать двойные кавычки только вокруг переменной и не использовать подстановочный знак, как этот? `для f в" $ workingdir "*; делать ... ` lennelei 6 лет назад 0
Я не вижу такой синтаксис в вопросе. Вы не должны задавать новые вопросы в комментариях. Кавычка `*` не будет расширена. Почему бы вам не попробовать `echo" $ workingdir "*`, `echo" $ workingdir * "`, `echo" $ workingdir "/ *` и `echo" $ workingdir / * "` и посмотреть самим? Kamil Maciorowski 6 лет назад 0
Прошу прощения за вопрос, я открою новый пост. lennelei 6 лет назад 0

1 ответ на вопрос

1
Ljm Dullaart

Ваш скрипт знает, какие файлы созданы и где они находятся.

Это общее утверждение является важным моментом здесь. Если вы действительно хотите удалить только файлы, которые вы создали, следите за тем, какие файлы вы создаете. Так что вы обычно делаете:

TMP1=$(mktemp -t example.1.XXXXXX) TMP2=$(mktemp -t example.2.XXXXXX) 

создать ваши временные файлы (см. man mktempподробности) и сделать

rm -f "$TMP1" "$TMP2" 

когда вы закончите с временными файлами. Кроме того, вы можете создать временный каталог и удалить его.

То, что вы не должны делать, это

rm -f /tmp/example.?.* 

потому что он также удалит временные файлы для других запущенных экземпляров скрипта.

На самом деле все немного сложнее: скрипт запускает задание java, которое использует переменные $ workingdir и $ var3 для хранения временных данных в папке $ workingdir / temp / $ var3. Я не хочу удалять эту папку в java-задании, потому что она может понадобиться (например, в случае сбоя). Вот почему я искал идеи для обеспечения безопасности сценария. lennelei 6 лет назад 0
Основной момент заключается в том, что вы должны отслеживать временные файлы, которые создает ваш скрипт (или код Java). Вы можете решить, какие файлы удалять, только если знаете, что это такое. Ljm Dullaart 6 лет назад 0

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