saboteur_kiev
@saboteur_kiev
software engineer

Bash Как использовать маски в переменных, чтобы они не раскрывались раньше времени?

Задача примерно такая:
хочу удалять определенные файлы в подкаталогах. Подкаталоги нахожу через find, затем в нужном каталоге нужно удалить файлы по маске.
Сперва делал обычно

... куча скрипта, в результате есть нужный каталог в ${CURRENTDIR}
rm -rf ${CURRENTDIR}/*/*/*.tgz
rm -rf ${CURRENTDIR}/*/*/*.vmdk.zip

Затем решил вынести список масок для удаления файлов в подгружаемую переменную, где маски разделены :
#!/bin/bash

DELETEITEMS="/*/*/*.tar.gz:/*/*/*.vmdk.zip:/*/*/*.ext3:/ipk/*/*.ipk"
OIFS=${IFS}
IFS=":"
for ITEM in ${DELETEITEMS}
  do
    echo "executing:"."${ITEM}"
  done
IFS=${OIFS}


Но возникла проблема, что в $ITEM сразу подгружается путь от корня, и executing выводит уже не маску а кучу имен файлов.
Понимаю, что маски файлов без кавычек сразу раскрываются, но не могу догнать как их расставить.
Кто может сходу подсказать более удачный вариант?
  • Вопрос задан
  • 3234 просмотра
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Автор вопроса, куратор тега Linux
software engineer
Сам разобрался. Надо юзать кавычки и массивы.
В примере ниже typeset -a не обязателен, но он обязателен, если присваивание DELETEITEMS идет из другой переменной (например сперва я прочитал LINE из какого-от файла, а затем присваиваю typeset -a DELETEITEMS="$LINE". Но главное, что маски файлов не будут раскрываться до тех пор, пока не заюзаешь их без кавычек. То есть в echo "executing: ${ITEM}" это еще маска, а в rm -rf $ITEM это уже список файлов по маске.

#!/bin/bash
typeset -a DELETEITEMS=("/*/*/*.epk" "/*/*/*.tar.gz" "/*/*/*.vmdk.zip" "/*/*/*.ext3" "/ipk/*/*.ipk")
for ITEM in "${DELETEITEMS[@]}"
do
echo "executing: ${ITEM}"
rm ${ITEM}
done
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
вариант с find не подойдет? т.е. найти и удалить. Я, правда, не уверен, что можно ограничить уровень вложенности (т.е. не удалять из каталогов первого и второго уровня, удалять из третьего)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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