rm -f не будет обрабатывать все аргументы в скрипте bash

Есть немного странной проблемы в bash. Я хочу написать сценарий, который принимает префикс имени файла и удаляет все файлы, которые начинаются с этого префикса и заканчиваются некоторыми заданными суффиксами. Для этого у меня есть следующая строка кода:

#!/bin/bash

if [ $# -lt 1 ]; then
        echo "Please provide an argument";
        exit 1
fi

# Ending dot already included in $1
rm -f $1"aux" $1"bbl" $1"blg" $1"synctex.gz" $1"log"

# But even if you call it wrong...
rm -f $1".aux" $1".bbl" $1".blg" $1".synctex.gz" $1 ".log"

exit 0

К сожалению, когда я вызываю мой сценарий (который называется cleanlatex), как предполагалось:

cmd$ cleanlatex lpa_aaai.

удаляется только файл.aux. очевидно rm -f не распространяет свое приложение на все аргументы, что было бы, если бы я явно запустил rm -f lpa_aaai.aux lpa_aaai.bbl ..., Что я здесь не так делаю?

Редактировать: чтобы ответить на вопрос @Etan, вот что я вижу, когда добавляю эти команды:

+ '[' 1 -lt 1 ']'
+ rm -v lpa_aaai.aux lpa_aaai.bbl lpa_aaai.blg lpa_aaai.synctex.gz lpa_aaai.log
removed ‘lpa_aaai.aux’
removed ‘lpa_aaai.bbl’
removed ‘lpa_aaai.blg’
removed ‘lpa_aaai.synctex.gz’
removed ‘lpa_aaai.log’
+ rm -v lpa_aaai..aux lpa_aaai..bbl lpa_aaai..blg lpa_aaai..synctex.gz lpa_aaai. .log
rm: cannot remove ‘lpa_aaai..aux’: No such file or directory
rm: cannot remove ‘lpa_aaai..bbl’: No such file or directory
rm: cannot remove ‘lpa_aaai..blg’: No such file or directory
rm: cannot remove ‘lpa_aaai..synctex.gz’: No such file or directory
rm: cannot remove ‘lpa_aaai.’: No such file or directory
rm: cannot remove ‘.log’: No such file or directory

Второй набор, состоящий из cannot remove сообщения, меня это не касается: в любом случае я могу удалить эти данные только как отказоустойчивые. Это сделал именно то, что мне было нужно. Спасибо.

1 ответ

Решение

Непонятно, в чем ваша проблема на самом деле; тем не менее, вы можете уменьшить ваш скрипт до двух строк bash:

: ${1?Please provide an argument}
rm -f "$1".{aux,bbl,log,synctex.gz,log}

Первая строка имеет тот же эффект, что и ваш if утверждение, используя стандартное расширение параметра POSIX.

Вторая строка правильно цитирует $1 и использует расширение скобок для получения последовательности имен файлов с требуемым списком суффиксов. Это делает упрощенное предположение, что пользователь набрал базовое имя файлов без завершающего периода: кто будет печатать foo. когда foo будет достаточно? Вы уже предполагаете, что нет названных файлов (например) foo.aux а также foo..auxТаким образом, вы могли бы также сделать предположение, что делает меньше работы.

Я удалил exit 0 потому что либо rm успешно, и ваш скрипт все равно выйдет со статусом 0, или rm терпит неудачу, в этом случае вы не должны выходить со статусом 0, но независимо от статуса rm выход с.

Другие вопросы по тегам