Во-первых, восстановить дерево каталогов источника в месте назначения:
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
вместо того, чтобы делать все сразу в .
.
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
awk -v 'n=3' '/pattern/ && !--n, 0'
Пример:
$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30
% 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
.