Простой сценарий оболочки для добавления строк из файла newdata
в datafile
. Должно быть просто изменить newdata
на здесь -doc. На самом деле это не очень эффективно, так как вызывает grep
для каждой (новой )строки ввода:
target=datafile
while IFS= read -r line ; do
if ! grep -Fqxe "$line" "$target" ; then
printf "%s\n" "$line" >> "$target"
fi
done < newdata
Для каждой строки мы используем grep
, чтобы узнать, существует ли она уже в целевом файле, -F
для фиксированного, -совпадения строки, (без регулярных выражений, ), -x
для полного совпадения строки, и -q
для подавления вывода совпадающих строк. grep
возвращает ложный код ошибки, если не находит совпадающую строку, поэтому добавляет к целевому файлу, если отрицательный результат верен.
Более эффективно, в awk
. Это зависит от того, что awk
может обрабатывать произвольные строки как ключи к массиву.
$ awk 'FNR == NR { lines[$0] = 1; next } ! ($0 in lines) {print}' datafile newdata
Первая часть FNR == NR { lines[$0] = 1; next }
загружает все строки первого входного файла в качестве ключей в (ассоциативный )массив lines
. Вторая часть ! ($0 in lines) {print}
работает со следующими входными строками и печатает строку, если ее нет в массиве, то есть «новые» строки.
Результирующий вывод содержит только новые строки, поэтому его необходимо добавить к исходному файлу, например. сsponge
:
$ awk 'FNR == NR { lines[$0] = 1; next } ! ($0 in lines) {print}' datafile newdata | sponge -a datafile
Или мы могли бы awk
добавить строки к последней строке, для этого просто нужно передать имя файла вawk
:
$ target=datafile
$ awk -vtarget="$target" 'FNR == NR { lines[$0] = 1; next }
! ($0 in lines) {print >> target}' "$target" newdata
Чтобы использовать здесь -документ с awk
, нам нужно добавить-
(stdin )в качестве явного исходного файла, в дополнение к настройке перенаправления,такawk... "$target" - <<EOF
The kernel is RAM-resident executable code. The rootfs is the essential filesystem for the system (initially a ramfs or tmpfs), but more often is used to refer to a collection of files in a filesystem of some type (e.g. ramfs, ext2/3/4, jffs2, ubifs) that consist of essential initialization and userspace programs. Both are needed to boot a Linux system.
Взято из сестринского сообщества, в котором кто-то задал аналогичный вопрос. Нажмите здесь для получения дополнительной информации.
Старые загрузчики могли монтировать только примитивные файловые системы, поэтому ядро оставалось при загрузке, а ОС — в корневом каталоге. Одним из способов предотвращения некоторых типов сбоев из-за переполненной файловой системы является создание для каждой вещи собственной файловой системы. Еще одним удобством использования нескольких разделов является то, что их можно легко создавать резервные копии и восстанавливать по отдельности. Некоторые файловые системы, такие как ZFS, BTRFS, LVM? не поддерживаются загрузчиками, которые сами не используют ядро Linux.
Проблема с этими идеями заключается в том, что обновление ядра может завершиться ошибкой, если загрузочный том переполнится, когда есть много другого доступного места. Быстрые инкрементные моментальные снимки доступны только в расширенных файловых системах.
Таким образом, дистрибутив ОС должен решить, на какой обмен -пойти.
Совершенно независимо от файловых систем существуют некоторые функции (безопасности и прочие ), которые сопоставляют ядро с памятью, а затем ограничивают доступ к этой памяти с помощью аппаратного и/или программного обеспечения для обеспечения соблюдения прав и предотвращения повышения привилегий. См. режим пользователя против режима ядра .