Невозможно rm -rf с использованием переменной

Я пытаюсь написать сценарий BASH, который рекурсивно удалит все файлы в каталоге.

Когда я пишу в консоли rm -rf /home/dir/dir/*, это прекрасно работает, но я не могу сделать это с помощью переменных.

VAR="/home/dir/dir"
rm -rf "$VAR"/*

Этот код не работал для меня.

Обновление Это действительно очень странно. Я пытался удалить кавычки, но это не сработало.

Вот весь мой файл:

#### VARIABLES

LOGS_PATH="~/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega\ test"

#### End of variables


#### FUNCTIONS

delete_logs()
{
    rm -rf $LOGS_PATH/*
    echo "Logs from $LOGS_PATH were deleted"

}

#### End of functions

#### MAIN

delete_logs

#### End of main

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


person Laughing_Man    schedule 12.07.2019    source источник
comment
Какая у вас ошибка? Что печатает echo "$PATH"/*"? Вы буквально использовали PATH для своей переменной?   -  person cyberbisson    schedule 12.07.2019
comment
Вы уверены, что хотите использовать здесь системную переменную PATH?   -  person jottbe    schedule 12.07.2019
comment
1: не используйте PATH. 2: НЕ структурируйте это так, чтобы эта переменная КОГДА-ЛИБО могла быть пустой, особенно если вы выполняете ее как root... 3: Какую ошибку вы получаете?   -  person Paul Hodges    schedule 12.07.2019
comment
Простите за это. Я забыл, что PATH это системная переменная. Я изменил его.   -  person Laughing_Man    schedule 12.07.2019
comment
Я обнаружил некоторые проблемы, если используемая переменная содержит тильду для ссылки на домашний каталог пользователя. Так, например, ls "~" не работает. Но вы должны быть очень осторожны, если делаете что-то вроде rm -rf "$VAR"/*. Если VAR пусто, вы знаете, что происходит...   -  person jottbe    schedule 12.07.2019
comment
Устраните целый класс проблем, отказавшись от пробелов в ваших рабочих путях (LOGS_PATH). Удачи.   -  person shellter    schedule 12.07.2019


Ответы (2)


Вы можете избежать проблемы с тильдой, просто используя переменную home. Так что просто напиши

LOGS_PATH="${HOME}/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega test" 

вместо

LOGS_PATH="~/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega test" 

и команда

rm -rf "$LOGS_PATH"/*

Должен снова использоваться.

person jottbe    schedule 12.07.2019

1) Удалите \ перед пробелом внутри строки в двойных кавычках. Вам не нужно экранировать пробелы внутри кавычек. Команда rm (точнее оболочка во время расширения ) ищет пути, которые буквально содержат обратную косую черту и пробел, что, вероятно, неверно.

2) Использование переменной необходимо заключать в кавычки, чтобы содержащиеся пробелы не мешали разбиение на слова.

3) Оболочка не сможет развернуться *, если папка пуста (если вы не установите определенные параметры). Затем команда rm будет искать файлы, буквально содержащие *, и, конечно же, потерпит неудачу.

4) Не заключайте ~ в кавычки, если хотите, чтобы оболочка расширила его до ${HOME}. Или просто явно используйте ${HOME}, потому что правила оболочки для обработки ~ немного сложны.

Поскольку вы все равно хотите удалить содержимое папки, вам лучше использовать find:

LOGS_PATH="${HOME}/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega test"

find "${LOGS_PATH}" -depth -mindepth 1 -delete
  • -depth скажет find работать сначала в глубину, то есть «найти» содержимое папки перед «нахождением» самой папки. Это необходимо, потому что вы хотите удалить найденные результаты, которые должны быть файлами или пустыми папками, поэтому это нужно делать изнутри наружу.
  • -mindepth 1 скажет find исключить базовый каталог из результата, чтобы вы не удаляли базовый каталог
  • -delete скажет find удалить найденные пути.

Оставьте -delete, чтобы увидеть только результаты, не удаляя их. Вы можете добавить -print в конец, чтобы увидеть, какие пути были удалены.

person Robin479    schedule 12.07.2019