Попробуйте следующую строку
find /path/to/files -mtime +7 -size +1M
В целом это предупреждение совершенно безвредно и нормально. Когда dpkg
удаляет (или пытается удалить) пакет, он удаляет все файлы и каталоги, созданные в ходе установки пакета. Теперь предположим, что в каталоге есть файлы, которые могут быть удалены в таком сценарии, и dpkg
не знает об этих файлах. Это может произойти либо потому, что они были созданы компьютером, либо во время, либо после установки, либо потому, что они были созданы пользователем. Тогда, если не указано, dpkg
не будет удалять эти файлы. Так как по умолчанию он не удалит непустой каталог, в таком случае каталог, содержащий эти файлы, не будет удален. Таким образом, после того, как пакет будет удален, вы можете оказаться в основном пустой каталог (или каталоги) с несколькими генерируемыми машиной файлами или что-то в этом роде. Это не проблема - их можно просто удалить вручную.
Следует отметить, что все указанные выше значения по умолчанию являются разумными. Здесь нет никаких ошибок.
В вашем случае вы устанавливаете файлы на /usr/local
как часть вашего двоичного пакета Debian, что является нарушением Стандарта Иерархии Файлов и является неправильным . Не делай этого. Пользовательские двоичные файлы должны входить в /usr/bin
, например, библиотеки должны входить в /usr/lib
и т.д. Предполагается, что пакет создает /usr/local/bin
, поскольку dpkg
, естественно, уже не знает об этом. (Так как пакет Debian, содержащий файлы/каталоги в /usr/local
, является нарушением политики FHS и, следовательно, политики Debian). Поэтому он пытается удалить этот файл при удалении пакета. Прекратите установку в /usr/local
, и проблема исчезнет.
Дать нам немного больше контекста, возможно? Почему вы пытаетесь построить свой собственный пакет zsh Debian, а не использовать дистрибутив, и какой дистрибутив вы используете в любом случае?
Если вы действительно хотите сделать это, вот простой наконечник. Проверьте, как ваш дистрибутив (или даже Debian) пакеты zsh, и просто повторно использовать пакет. Это должно сработать нормально. Нет причин пытаться писать свои собственные, если только вы не пытаетесь научиться упаковывать, что, я полагаю, здесь не так.
-121--70060- Можно запустить yum erase elfutils-libelf
в зависимые пакеты, которые необходимо удалить, чтобы удалить elfutils-libelf.
Перед передачей содержимого файла в sed
можно развернуть оболочку:
sed -e "s/$(cat needle.txt)/replace/" subject.txt
Обратите внимание на использование двойных кавычек.
Это сделает sed
интерпретировать любые метасимволы regex из needle.txt
как метасимволы regex, а не обычные символы. Если needle.txt
содержит /
, он будет прерван.
Если требуется, чтобы строки needle.txt
интерпретировались буквально (даже если они содержат метасимволы regex, как в вашем примере), можно сделать что-то вроде:
perl -pe '
BEGIN{ local $/;
open $IN,"<","needle.txt";
$needle = <$IN>
}
s/\Q$needle/replace/
' subject.txt
Объяснение
-pe
означают применение кода, следующего за строкой, к строкам файла subsuect.txt
и печать каждой строки после завершения обработки. BEGIN {}
выполняется только один раз. Он открывает файл needle.txt
и сохраняет все его содержимое в переменной $ eigle
. s/\Q $ eigle/replace/
- это тот же синтаксис, который вы ожидали от sed
, за исключением того, что \Q
заставляет регексный движок Perl рассматривать всё после него как фиксированный ряд, а не как регекс. sed
очень специфичен для r
ead - он будет делать это только для строки, которая соответствует его шаблону - и всегда будет делать это последней . sed
не будет r
извлечь файл для соответствующего шаблона, если шаблон перестает соответствовать до того, как он очистит строку. По крайней мере, я думаю, что это работает - я неплохо разбираюсь в sed
, но r
иногда все еще сбивает меня с толку.
В любом случае, уловка состоит в том, чтобы позволить ему выровнять строку по желаемому шаблону - тем самым обеспечивая вывод для этой строки, но задержать этот вывод хотя бы на одну строку, а затем отредактировать его.
Вы можете сделать это относительно легко с помощью N; P; D
- который будет работать согласованно, чтобы продвинуть счетчик строк sed
как минимум на одну строку впереди печатаемых строк. Рассмотрим следующие два файла:
###file1
some string 1
some string 2
some other string
some string 4
some string 5
###file2
some other file
Теперь моя цель - выполнить подстановку, заменяя шаблон, от которого зависит r
ead, и , чтобы получить r
ead для распечатайте его содержимое до того, как мое изменение будет напечатано. Вот как я это делаю:
sed '$!N;s/other \(.*\)\(\n\)/\1 3\2/
/\n.*other/r file2
P;D' file1
some string 1
some string 2
some other file
some string 3
some string 4
some string 5
Я также проделал то же самое с другим файлом2, который напечатал ...
some string 1
some string 2
no trailing newline some string 3
some string 4
some string 5
У меня есть некоторые довольно серьезные сомнения относительно переносимости такого поведения, но это было с GNU sed
, чего стоит.
Итак, в приведенных выше командах sed
считывает ввод на одну строку раньше, когда печатает. N
добавляет следующую строку ввода в пространство шаблонов, P
печатает до первого \ n
символа электронной строки в пространстве шаблонов, и D
удаляет до первого символа \ n
ewline в пространстве шаблонов перед тем, как начать заново с того, что осталось. Таким образом, каждая строка, которую мы видим напечатанной, находится на одну строку позади sed
, взглянув на нее - sed
получает на входе двухстрочное окно.
Шаблон, который соответствует r
ead, соответствует только тогда, когда символ \ n
ewline встречается перед , которому он соответствует для цикла, когда sed
сначала втягивает его с помощью N
- он соответствует только циклу, в котором мы его не видим.
Замена происходит только тогда, когда \ n
ewline встречается после шаблона - это цикл, в котором он будет P
ритирован, в конце концов, но sed
очищает свой буфер строки и увеличивает строку, когда мы извлекаем строку N
ext, поэтому затем печатается r
, а затем , затем ] происходит замена. Это действительно утомительно, но я тоже.
И, говоря о GNU sed
, он действительно предлагает довольно интересный вариант для подобных ситуаций.
sed '/other/{x;s/.*/cat file2/e;G
s/\(.*\)\n\(.* \)other \(.*\)/\1 \2\3 3/
}' file
info sed
сообщит вам ...
e [COMMAND]
Эта команда позволяет направлять ввод от команды оболочки по конвейеру в пространство шаблонов
.Без параметров команда `e 'выполняет команду
, которая находится в пространстве шаблонов, и заменяет пространство шаблона
выводом; завершающий символ новой строки подавляется. Там я также немного перетасовываю пространство шаблонов - мне нужно пустое пространство шаблонов, в котором можно запустить мою команду, и поэтому я переключаюсь на неиспользуемое пространство удержания. Но это немного проще понять, потому что вам не нужно учитывать время сброса строки. По сути, это то, что уже предлагалось другими способами, с, возможно, небольшим преимуществом в том, что любой из специальных символов sed
не будет генерировать ошибку, если они существуют в целевом файле чтения.
Кстати, выше напечатано:
some string 1
some string 2
some other file some string 3
some string 4
some string 5