Команда rm в сценарии bash не работает с переменной

«Бинарные» ядра ( vmlinuz или около того) представляют собой небольшой фрагмент кода, который распаковывает остальную часть сжатого ядра. У них так много общего, что большая часть начала файла одинакова (поэтому он сжимается до одного и того же).

Различия в размере исходных архивов довольно несущественны, большинство изменений от одной версии к другой - это строки изменены и добавлены новые драйверы (и драйверы не отображаются в двоичном ядре, они используются только на некоторых машинах и, следовательно, обычно внешние модули).

5
28.11.2016, 16:41
3 ответа

Альтернативный способ - комбинировать rm с find и / или xargs. Вот несколько альтернатив:

find "$output" -name *.gz -type f -delete
find "$output" -name "*.gz" -type f -exec rm '{}' \;
find "$output" -name *.gz -type f -print0 | xargs -0 rm

PS: тип f означает поиск файлов.

По умолчанию find ищет все подкаталоги. Вы можете ограничить операцию поиска текущим каталогом, если требуется, используя параметр maxdepth:

find "$output" -maxdepth 1 -name "*.gz" -type f -exec rm '{}' \;

Если вам нужно продолжать работать с rm и переменной, это сработало для меня в одной строке:

out="/home/gv/Desktop/PythonTests/appsfiles";rm "$out"/*.txt
rm: remove regular file '/home/gv/Desktop/PythonTests/appsfiles/a.txt'? y
rm: remove regular file '/home/gv/Desktop/PythonTests/appsfiles/a ver 1.txt'? y
rm: remove regular file '/home/gv/Desktop/PythonTests/appsfiles/b.txt'? y
rm: remove regular file '/home/gv/Desktop/PythonTests/appsfiles/c.txt'? y
rm: remove regular file '/home/gv/Desktop/PythonTests/appsfiles/d.txt'? y
2
27.01.2020, 20:34

Командная строка оболочки

rm "$OUTPUT/*.gz"

указывает оболочке выполнить / bin / rm с двумя аргументами: rm и / путь / к / backup / files / *. Gz .

Пробел, " и $ являются специальными символами в синтаксисе языка оболочки. Пробел используется для разделения аргументов команд, " используется для цитирования других специальные символы (не все, $ , например, все еще особые), такие как * выше, а $ используется для некоторых расширений (например, $ Расширение параметра OUTPUT , которое вы здесь используете).

rm после запуска попытается удалить этот / путь / к / backup / files / * .gz файл. Если этот файл не существует (как в случае с вами), он сообщит об ошибке.

Когда вы пишете:

rm /path/to/backup/files/*.gz

или

rm "$OUTPUT"/*.gz

Поскольку * на этот раз не цитируется, это запускает другую специальную функцию оболочки, называемую подстановкой или генерацией имени файла или расширением имени файла. Оболочка пытается развернуть слово, содержащее этот символ * , до списка имен файлов, соответствующих шаблону.

Итак, если / путь / к / backup / files содержит файлы a.gz и b.gz , оболочка фактически вызовет rm с 3 аргументами: rm , /path/to/backup/files/a.gz и /path/to/backup/files/b.gz , что больше похоже на то, что вы хотите здесь.

Обратите внимание, что сам $ OUTPUT по-прежнему необходимо указывать в кавычках, иначе он может быть разделен, если он содержит символы $ IFS , или также может подвергаться подстановке, если он содержит какие-либо символы подстановки (например, * выше).

Также неплохо было бы привыкнуть писать:

rm -- "$OUTPUT"/*.gz

Здесь $ OUTPUT начинается с / , так что все в порядке, но в тот день, когда вы измените Например, от $ OUTPUT до -foo- он перестанет работать, поскольку -foo - / ... будет использоваться rm в качестве параметров .

Если сценарий не предназначен для интерактивного использования, вы можете добавить параметр -f в rm .Это отключит все запросы пользователя и удалит ошибку, если нет подходящего файла (большинство оболочек, когда глобус не имеет совпадения, передают шаблон как есть в приложение, а rm -f не пожаловаться, когда вас попросят удалить файл, который вообще не существует).

15
27.01.2020, 20:34

Попробуйте получить эти файлы, а затем удалить их:

ARCS=`ls $OUTPUT | grep "\.gz$"`

for _arch in $ARCS; do
    rm -f $_arch
done
-2
27.01.2020, 20:34

Теги

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