Основная проблема заключается в том, что подстановка команды не заключена в кавычки, поэтому она разбивается на отдельные аргументы, и каждый аргумент подвергается расширению пути (, последняя часть в bash
, но не zsh
), и когда mv
видит более двух, предполагается, что последний является каталогом для перемещения файлов.
По той же причине само $i
следует заключать в кавычки (в bash
), и во избежание проблем, если какое-то имя файла начинается с тире -
, следует использовать ./*
вместо *
в шаблоне или поставьте конец -из -маркера опций --
в команде mv
.
Кроме того, я думаю, мы могли бы немного упростить способ обработки имен файлов. Начнем с того, что sed
может принимать несколько команд, поэтому вам нужно вызвать его только один раз. Вы также, вероятно, захотите добавить /g
в конец команд s///
, чтобы сделать замены для всех совпадений, а не только для первого. Также обратите внимание, что 2 из этих 3 обратных слэшей в [_\?\!\]
избыточны. Используйте [_?!]
, если вы хотите сопоставить _
, ?
или !
или [_\?!]
, если вы также хотите включить обратную косую черту (, хотя [_\\?!]
сделает его более надежным с некоторыми утилитами ).
for f in./*; do
mv -- "$f" "$(grep \# "$f" | head -1 | sed -e 's/# //g' -e 's/[_?!]//g' -e's/[:/]/ - /g')"
done
Вы также можете объединить grep
и head
в sed
тоже:
for f in./*; do
mv -- "$f" "$(sed -ne '/^# / {s///; s/[_?!]//g; s/[:/]/ - /g; p; q;}' < "$f")"
done
Здесь команды внутри {}
зависят от шаблона /^# /
, а q
в конце выходит из скрипта в конце этого блока,поэтому обрабатывается только первая совпадающая строка.
Аналогично вawk
:
awk '/^# / { sub(/# /, ""); gsub(/[_?!]/, ""); gsub(/[:/]/, " - "); print; exit }' < "$f"
Я мог бы также изменить последнюю замену на s/[:/] */ - /
, чтобы строка типа blah: bleh
превратилась в blah - blah
вместоblah - bleh
(с двумя пробелами после дефиса ).
Когда вы запускаете apt
, он сообщает вам обо всех автоматически удаляемых пакетах после вычисления результата того, что вы просите его сделать. Сюда входят как пакеты, которые уже были автоматически удалены до вызова apt
в результате предыдущих удалений пакетов, так и пакеты, которые будут автоматически удалены в результате запрошенных операций.
В данном конкретном случае перечисленные пакеты не связаны с qbittorrent
, и его удаление не сделало их автоматически удаляемыми; они уже были.