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
выход с.