удалить от начала файла до n-го вхождения шаблона

Во-первых, восстановить дерево каталогов источника в месте назначения:

cd source
find -type d -exec mkdir -p destination/{} \;

{} в находке должен содержать относительный путь к каждому каталогу.

Затем проверьте, хорошо ли выглядит дерево каталогов, созданное вами в месте назначения. И попробуйте переместить каждый файл по отдельности:

cd source
find -type f -exec mv {} destination/{} \;

Я не могу сказать вам достаточно, насколько это потенциально опасно. Вы можете потерять данные! Я не уверен, что будет делать find , если он не может stat файл. Я надеюсь, что он просто выдаст сообщение об ошибке и пойдет дальше. Но поскольку вы, очевидно, пытаетесь восстановить данные с поврежденного носителя, вы, вероятно, знаете о каких-либо рисках.

Если это сработает, как задумано, в исходном коде останутся только каталоги и файлы, которые нельзя переместить. Если хотите, вы можете поискать в SO, как рекурсивно удалить пустые каталоги (я на 100% уверен, что об этом уже спрашивали раньше), чтобы упростить анализ.

Я предлагаю вам сделать небольшой тест на поврежденном носителе. mkdir несколько каталогов, коснитесь некоторых случайных файлов и попробуйте эти шаги, чтобы увидеть, что произойдет. Также, вероятно, будет хорошей идеей, если вы будете делать это в одном каталоге за раз, а не в корне.


Я имею в виду, что если ваша структура, например:

.
├── dir1
│   ├── fileA
│   └── subdir1
│       └── fileB
├── dir2
│   └── fileC
└── dir3
    ├── subdir1
    │   └── fileD
    └── subdir2
        └── fileE

Затем запустите ее 3 раза; один раз в dir1 , затем, если все работает гладко, перейдите к dir2 и dir3 вместо того, чтобы делать все сразу в . .

1
04.11.2016, 15:52
2 ответа

Чтобы исключить n вхождение шаблона

awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'

(замените 3 числом вхождения, которые вы хотите (2 в вашем случае), и шаблон с вашим фактическим шаблоном ( foo в вашем случае)).

Пример:

$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30

В включить n вхождение шаблона

awk -v 'n=3' '/pattern/ && !--n, 0'

Пример:

$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30
4
27.01.2020, 23:19
% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something

Где NTH - сколько раз, а затем вам нужен флаг для печати; уменьшить NTH при совпадении и разрешить печать, если NTH уменьшилось достаточно. Переместите print в конец, чтобы поймать окончательный желаемый foo .

0
27.01.2020, 23:19

Теги

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