Предотвратите активное удаление файла в файловой системе NFS

Этот сценарий Bash делает то, что нужно, но не использует только sed и awk . Я уверен, что если бы больше времени было потрачено на разработку этого, его можно было бы доработать, но он, примерно, делает то, что вы хотите.

$ more cmd.bash 
#!/bin/bash

while read line; do 
    f1=$(echo "$line" | awk -F", " '{print $3}')
    f2=$(echo "$line" | awk -F", " '{print $7}')
    echo "$line" | grep  "${f1}.*$(expr ${f1:2} + 1).*${f2}.*$(expr ${f2:2} + 1)"
done <file

Пример выполнения

$ ./cmd.bash 
RZ_AUTO_1, 1cx0, C118, B, C119, B, A165, B, A166, B, CC/AA Canonical ribose-zipper
RZ_AUTO_2, 1drz, C118, B, C119, B, A165, B, A166, B, CC/AA Canonical ribose-zipper
RZ_AUTO_3, 1ffk, C208, 0, G209, 0, A665, 0, A666, 0, CG/AA Canonical ribose-zipper

Слабые места

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

-121--248796-

Если вы можете использовать perl :

$ perl -F, -anle '
    map { s/\D//g } @F;
    print if ++$F[2] == $F[4] and ++$F[6] == $F[8];
' file
RZ_AUTO_1, 1cx0, C118, B, C119, B, A165, B, A166, B, CC/AA Canonical ribose-zipper
RZ_AUTO_2, 1drz, C118, B, C119, B, A165, B, A166, B, CC/AA Canonical ribose-zipper
RZ_AUTO_3, 1ffk, C208, 0, G209, 0, A665, 0, A666, 0, CG/AA Canonical ribose-zipper
-121--248795-

Хотя сначала предлагаемый «вызов» может показаться трудным, неосуществимым или звучит наивно, как некоторые прокомментировали, это не так. Основная идея, лежащая в основе использования dd для миграции с большего диска на меньший, прекрасно подходит и имеет преимущества для миграции данных. Конечно, наличие достаточного свободного пространства, чтобы занятые данные помещались на диске назначения, является необходимым требованием.

Идея состоит в том, чтобы думать в каждом разделе индивидуально, а не весь диск сразу, как первоначально предложено. Еще больше может быть достигнуто: разделы, которые будут усечены, также могут быть безопасно перенесены с помощью небольших инструментов изменения размера файловой системы. Действительно, такой вид миграции интересен для того, чтобы сохранить matadata файловой системы и расширенные атрибуты файлов, которые не могут быть легко скопированы с помощью таких инструментов, как cp, rsync, pax,... которые работают на уровне файловой системы, а не блокируют уровень устройства. Использование dd устраняет необходимость переустановки ОС или повторной маркировки FS во избежание проблем с SELinux.

Ниже приведено то, что я обычно делаю для выполнения аналогичных задач:

1) Сначала необходимо уменьшить количество файловых систем в соответствующих разделах, которые будут усечены. Для этого используйте инструмент resize2fs (предполагая, что речь идёт о ext2/ext3/ext4 fs - другие современные FS также имеют инструменты изменения размера для той же цели). Обратите внимание, что хотя по понятным причинам файловая система не может быть больше раздела, в котором она находится, она может быть и меньше. Хитрость безопасности здесь в том, чтобы уменьшить «больше, чем нужно». Например, представьте, что у вас есть файловая система 1TB, которую вы хотите перенести на диск 500 Gig. В этом случае я предлагаю сократить fs до, скажем так, 450 Gig (для этого должно быть достаточно свободного пространства, конечно, т.е. занимаемое в данный момент пространство в этой файловой системе не может превышать 450 Gig). После миграции данных будет исправлено кажущееся потраченное впустую пространство в 50 ГГц.

2) Разбиение целевого диска с соответствующей геометрией с учетом ограничений пространства;

3) dd данных с использованием устройства (устройств) разбиения, а не дискового устройства (т.е. используйте dd if =/dev/sda # of =/dev/sdb # для каждого раздела вместо использования if =/dev/sda of =/dev/sdb ). ПРИМЕЧАНИЕ: sda и sdb здесь являются всего лишь примерами; ВАЖНОЕ ПРИМЕЧАНИЕ:При переходе от большего к меньшему устройству разбиения dd будет жаловаться на попытку записи сообщения в конец блочного устройства, это нормально, так как данные файловой системы были бы полностью скопированы до достижения этой точки. Чтобы избежать такого сообщения об ошибке, можно указать размер копии с помощью параметров bs = и count = для соответствия размеру сокращенной файловой системы, но это потребует некоторых (простых) вычислений, но если это будет сделано неправильно, это может привести к риску для ваших данных.

4) После ввода данных снова измените размер соответствующих файловых систем в целевом разделе (разделах), используя resize2fs. На этот раз новый размер файловой системы не указан. При запуске без спецификации размера, resize2fs увеличивает файловую систему так, что она занимает максимально допустимый размер, поэтому в этом случае файловая система 450 Gig снова вырастет, чтобы занять весь раздел 500 Gig, и ни один байт не будет потрачен впустую. (Подход «уменьшить больше, чем нужно» позволяет избежать случайного указания размеров и подвергнуть риску ваши данные. Обратите внимание, что единицы GB и GiB могут быть сложными).

Примечание для более сложных операций: Если у вас есть диспетчер загрузки, который вы собираетесь скопировать вместе, что, скорее всего, так и будет, вы можете добавить первые несколько КБ диска, используя дисковое устройство вместо устройств разбиения (например, dd if =/dev/sda of =/dev/sdb bs = 4096 count = 5 ), а затем реконфигурировать геометрию в/dev/sdb (который временно будет содержать недопустимую геометрию для нового диска, но неповрежденный и действительный диспетчер загрузки). Наконец, продолжайте использовать устройства разбиения, как описано выше, для одновременного разбиения. Я делал такие операции много раз. Совсем недавно я успешно выполнил сложную миграцию при обновлении с жесткого диска, содержащего смесь установок MacOSX & Linux, на меньший SDD в моей MacMini6,2. В этом случае мне пришлось загрузить Linux с внешнего диска, запустить bootmanager, запустить gdisk для исправления GPT на новом диске и, наконец, dd 'd каждый раздел, содержащий только что сжатые файловые системы. (Обратите внимание, что схема разделов GPT сохраняет две копии таблицы разделов, одну в начале и другую в конце диска. gdisk много жалуется, потому что он не может найти вторую копию PT и потому что разделы превышают размер диска, но он правильно исправляет проблему копирования PT после переопределения геометрии диска). Это был гораздо более сложный случай, но стоит упомянуть, потому что иллюстрирует, что такого рода операции также вполне осуществимы.

Удачи!... и, самое главное, не забудьте создать резервную копию всех важных данных перед такой операцией. Ошибка, и вы, безусловно, можете повредить свои данные.

И на случай, если я недостаточно подчеркну: создайте резервную копию данных перед миграцией!:)

1
26.05.2014, 00:09
1 ответ

Метод 1

Используйте этот простой Bash Script

Примечание: он ничего не сделает, он просто распечатает файл с rm, который будет удален после удаления [1180052]echo[1180053] команды

Метод 2 Используя xargs

iTunes

0
28.01.2020, 01:56

Теги

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