«Бинарные» ядра ( vmlinuz
или около того) представляют собой небольшой фрагмент кода, который распаковывает остальную часть сжатого ядра. У них так много общего, что большая часть начала файла одинакова (поэтому он сжимается до одного и того же).
Различия в размере исходных архивов довольно несущественны, большинство изменений от одной версии к другой - это строки изменены и добавлены новые драйверы (и драйверы не отображаются в двоичном ядре, они используются только на некоторых машинах и, следовательно, обычно внешние модули).
Альтернативный способ - комбинировать 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
Командная строка оболочки
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
не пожаловаться, когда вас попросят удалить файл, который вообще не существует).
Попробуйте получить эти файлы, а затем удалить их:
ARCS=`ls $OUTPUT | grep "\.gz$"`
for _arch in $ARCS; do
rm -f $_arch
done