Как удалить поврежденный файл на разделе NTFS?

#IF проголосовано против, объясните причину в комментарии. Облом !!!

Из моего комментария я пришел к решению:

Вся командная строка выглядит так: $ find. -тип f -printf "% T @% p% s \ n" | sort -n -r | awk '{я + = 3 доллара; if (i <= 200000) {print $ 2}} '| tar -cvf toto.tar -T - && ssh -n prd "rm -rf dir / *" && scp toto.tar prd: tmp / && ssh -n prd "tar xvf tmp / toto.tar"

Команда начинается с поиска, который ищет все файлы в текущем каталоге (должен быть адаптирован к пути к каталогу на сервере A) и выводит 3 поля

  • % T @ выводит временную метку unix
  • % p выводит путь к файлу, откуда запускается find
  • % s, конечно, выводит размер файла в байтах
  • \ n для новой строки.

Затем сортировка вывода find выполняется командой sort -n -r , которая выполняет обратную сортировку по первому полю, сортируя временную метку unix от самой последней к самой старой.

Чтобы справиться с ограничением размера, awk немного помогает, печатая второе поле вывода sort до тех пор, пока сумма размера не станет ниже предела. Для каждой обрабатываемой строки он суммирует значение третьего поля (размер) с локальной переменной i , затем выводит второе поле вывода сортировки, если i ниже лимита.

tar -cvf toto.tar -T - создаст архив с именем toto.tar на основе списка файлов, предоставленного выводом awk .

В случае успеха первое удаление резервной копии сервера B; затем scp toto.tar host: dir передаст файл на удаленный сервер (сервер B), а затем ssh -n "tar xvf dir / toto.tar распакует переданный архив в удаленную папку с сохранением структуры каталогов .

Мое предыдущее решение, основанное на scp, не сохраняло структуру каталогов, поэтому я отредактировал этот ответ.

Вот результат запуска в моем домашнем каталоге с максимальным размером 200 КБ:

$ rm toto.tar; find . -type f -printf "%T@ %p %s\n"| sort -n -r | awk '{ i+=$3; if (i<=200000) {print $2}}'  | tar -cvf toto.tar -T -&& scp toto.tar prd:tmp/ && ssh -n prd "tar xvf tmp/toto.tar"
./.lesshst
./.viminfo
./scpplus
./.config/xfce4/desktop/icons.screen0-1350x650.rc
./.xsession-errors
./.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
./.config/pulse/7f14833c645d4a6abb0beba68b79e0c0-default-source
./.config/pulse/7f14833c645d4a6abb0beba68b79e0c0-default-sink
./.cache/imsettings/log
./.cache/gpg-agent-info
./.ICEauthority
./.vboxclient-draganddrop.pid
./.vboxclient-seamless.pid
./.vboxclient-display.pid
./.vboxclient-clipboard.pid
./.dbus/session-bus/7f14833c645d4a6abb0beba68b79e0c0-0
./.cache/xscreensaver/xscreensaver-getimage.cache
./.config/xfce4/desktop/icons.screen0-1264x950.rc
./work/fpart-0.9.2/src/fpart
toto.tar                                                                                                                              100%  170KB 170.0KB/s   00:00    
./.lesshst
./.viminfo
./scpplus
./.config/xfce4/desktop/icons.screen0-1350x650.rc
./.xsession-errors
./.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
./.config/pulse/7f14833c645d4a6abb0beba68b79e0c0-default-source
./.config/pulse/7f14833c645d4a6abb0beba68b79e0c0-default-sink
./.cache/imsettings/log
./.cache/gpg-agent-info
./.ICEauthority
./.vboxclient-draganddrop.pid
./.vboxclient-seamless.pid
./.vboxclient-display.pid
./.vboxclient-clipboard.pid
./.dbus/session-bus/7f14833c645d4a6abb0beba68b79e0c0-0
./.cache/xscreensaver/xscreensaver-getimage.cache
./.config/xfce4/desktop/icons.screen0-1264x950.rc
./work/fpart-0.9.2/src/fpart

Основное беспокойство вызывает факт это решение удаляет резервную папку перед переносом последних 10 гигабайт данных с основного сервера. Это не очень эффективно, если набор новейших данных и набор резервных данных имеют много общих файлов / каталогов. Но это очень простой способ чтобы действительно отследить последние 10 гигабайт (или что-то еще) новейших данных, какими бы ни были данные (быстрые и грязные)

update2: мне скучно, но я объясню второе решение.

Я наконец нашел второе решение, которое я сейчас объясню. Он неэффективно закодирован, это большой онлайн-ресурс, может быть отформатирован d в сценарий оболочки с базовой проверкой на случай сбоя или странного форматирования файла.

Самая большая проблема с первым решением заключается в том, что оно всегда пытается сделать резервную копию последних 10 ГБ самых новых файлов. Все, что уже зарезервировано. Это означает, что если при новом запуске будет только 100M новых файлов, будет удалена вся резервная копия и снова передано 10G данных (100Mnewest и на 9,9G меньше новых)

Вот единственная подсказка: {{ 1}} ssh -n prd 'cd / var / tmp / test / && find. -type f -printf "% T @% p% s \ n" '| awk' {print int ($ 1) "" $ 2 "" $ 3} '| sort -n -r> / tmp / remote; найти .-type f -printf "% T @% p% s \ n" | awk '{print int ($ 1) "" $ 2 "" $ 3}' | sort -n -r | awk '{я + = 3 доллара; if (i <= 200000) {print $ 1 "" $ 2 "" $ 3}} '> / tmp / locale; grep -F -x -v -f / tmp / remote / tmp / locale | cut -d "" -f2> / tmp / newfile; grep -F -x -v -f / tmp / locale / tmp / remote | cut -d "" -f2> / tmp / toremove; cat / tmp / toremove | при чтении i; do echo "удаление $ i на удаленном сервере"; ssh -n prd "RM / var / tmp / test / $ i"; Выполнено ; cat / tmp / newfile | tar -cvf toto.tar -T - && scp toto.tar prd: / var / tmp / test / && ssh -n prd "cd / var / tmp / test; tar xvf /var/tmp/test/toto.tar; rm /var/tmp/test/toto.tar "; rm / tmp / remote / tmp / locale / tmp / toremove / tmp / newfile toto.tar

Конечно, измените prd вашим сервером B и весь путь к каталогам на локальном / удаленном сервере, кроме создать временный файл. Остерегайтесь этого, не обращайтесь к чертовому имени файла с пустым пространством или специальным символом внутри.

Объяснение:

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

  • Сначала подключитесь к серверу резервного копирования и возьмите список файлов резервных копий: ssh -n prd 'cd / var / tmp / test / && find. -type f -printf "% T @% p% s \ n" '| awk' {print int ($ 1) "" $ 2 "" $ 3} '| sort -n -r> / tmp / remote; ; Мне нужно удалить дробную часть времени из-за некоторой проблемы с tar , которая всегда устанавливает дробную часть на 0 . Это означает, что дата между резервным сервером и исходным сервером будет отличаться в дробной части.Сортировка будет упорядочиваться от самого большого значения первого поля к самому низкому, что означает от самого нового файла к самому старому. И я сохраняю результат в файл / tmp / remote . Нет необходимости проверять весь размер, так как в предыдущей резервной копии я всегда переносил менее 10 ГБ.
  • во-вторых, я делаю то же самое локально, чтобы получить список самых новых файлов с суммированным размером ниже лимита: find. -type f -printf "% T @% p % s \ n" | awk '{print int ($ 1) "" $ 2 "" $ 3}' | sort -n -r | awk '{i + = $ 3; if (i <= 200000) {print $ 1 "" $ 2 "" $ 3}}'> / tmp / locale; ; я сохраняю результат в / tmp / locale

Фактически, все файлы, которые находятся в / tmp / locale , а не в / tmp / remote - это самые новые файлы для синхронизации на сервере резервного копирования.
Все файлы, которые находятся в / tmp / remote , а не в / tmp / locale , должны быть удалены на сервере резервного копирования (слишком старые) .

Чтобы различать эти подмножества, я использую grep :

  • grep -F -x -v -f / tmp / remote / tmp / locale | cut -d "" -f2> / tmp / newfile; отобразит все файлы, содержащиеся в / tmp / locale , а не в / tmp / remote , которые я сохраняю в / tmp / newfile
  • grep -F -x -v -f / tmp / locale / tmp / remote | cut -d "" -f2> / tmp / toremove; отобразит все файлы, содержащиеся в / tmp / remote , а не в / tmp / locale , и я сохраняю его в / tmp / toremove

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

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

И вот мы почти закончили. Удаляю временные файлы в / tmp для очистки.

В деталях это дает: cat / tmp / toremove | при чтении i; do echo "удаление $ i на удаленном сервере"; ssh -n prd "RM / var / tmp / test / $ i"; done; Этот цикл с чтением списка файлов i cat в качестве входных данных, отображает небольшое сообщение, сообщающее мне, какой файл он удаляет, и запускает удаленный rm через ssh

cat / tmp / newfile | tar -cvf toto.tar -T - && scp toto.tar prd: / var / tmp / test / && ssh -n prd "cd / var / tmp / test; tar xvf /var/tmp/test/toto.tar; rm /var/tmp/test/toto.tar"; создаст архив локали toto.tar , который будет содержать все файлы, перечисленные в / tmp / newfile . В случае успеха я передаю его на удаленный сервер, а затем удаленно распаковываю через ssh , удаляю архив также на сервере резервного копирования, таким образом он не будет мешать следующему запуску.

rm / tmp / remote / tmp / locale / tmp / toremove / tmp / newfile toto.tar - это локальная очистка файлов, используемая во время этого запуска.

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

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

1
08.09.2018, 21:50
1 ответ

Я надеюсь, что это поможет некоторым людям.

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

Например, если я попытаюсь cdвойти в эту папку, я получу Input/output error.

На самом деле я использовал Windows 10, чтобы решить эту проблему, и это было настолько просто, насколько это возможно:

  1. Я только что подключил этот диск к компьютеру с Windows 10.
  2. Он сразу заметил некоторые проблемы после auto -монтирует его и предлагает опцию «Сканировать и исправить», поэтому я просто выберите этот вариант.
  3. Примерно через 15 минут (для этого диска емкостью 4 ТБ )он завершился. успешно.

К счастью, при повторном подключении к Linux он также работал корректно.

2
01.03.2020, 21:52

Теги

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