Я щойно "mv" відправив каталог в 49 Гб на поганий шлях до файлу, чи можна відновити початковий стан файлів?


58

У мене є (ну, у мене був ) каталог:

/media/admin/my_data

Він був розміром приблизно 49 ГБ і мав у ньому десятки тисяч файлів. Каталог - це точка монтажу активного розділу LUKS.

Я хотів перейменувати каталог на:

/media/admin/my_data_on_60GB_partition

Я тоді не усвідомлював, але я видав команду з домашнього каталогу, тому я закінчив робити:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

Тоді mvпрограма розпочала переміщення /media/admin/my_dataта її вміст у новий каталог ~/my_data_on_60GB_partition.

Я використовував Ctrl+, Cщоб скасувати частину командної частини, тому тепер у мене є ціла купа файлів, розділених між каталогами:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

і

/media/admin/my_data           <---- about 47GB of orig files in here    

Новий каталог ~/my_data_on_60GB_partitionта деякі його підкаталоги належать root.
Я припускаю, що mvпрограма, мабуть, скопіювала файли як корінь спочатку, а потім після передачі chownповернула їх у мій обліковий запис користувача.

У мене є дещо стара резервна копія каталогу / розділу.
Моє запитання: чи можна надійно відновити купу файлів, які були переміщені?

Тобто чи можу я просто запустити:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

чи слід відмовитися від спроби відновлення, оскільки файли, можливо, пошкоджені та частково завершені тощо?

  • ОС - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

36
Увійдіть у звичку, коли не панікуйте на тип Control-Z(щоб зробити паузу), а не Control-C. У цьому випадку ви зможете побачити, який файл передавались у той час, і таким чином дізнаєтесь, який файл було скопійовано лише частково. Потім ви можете спокійно вирішити, як діяти далі. (Використовуйте kill -stopдля процесів, які не містяться в tty).
meuh

1
2 ГБ + 47 ГБ = 60 ГБ ???
tbodt

7
@tbodt (2GB + 47GB) < 60GB. Ємність розділу - 60 Гб, розмір папки та її вміст: 49 Гб.
the_velour_fog

Відповіді:


87

Під час переміщення файлів між файловими системами mvне видаляйте файл, перш ніж закінчити його копіювання, і він обробляє файли послідовно (я спочатку сказав, що він копіює, а потім видаляє кожен файл по черзі, але це не гарантується - принаймні mvкопії GNU потім видаляють кожну команду- аргумент рядка по черзі, і POSIX визначає цю поведінку ). Таким чином, у вас повинен бути щонайменше один неповний файл у цільовому каталозі, а оригінал все одно буде знаходитися у вихідному каталозі.

Щоб повернути речі назад, додайте -iпрапор, щоб mvнічого не переписати:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(припустимо, що у вас немає прихованих файлів для відновлення з ~/my_data_on_60GB_partition/) або ще краще (враховуючи, що, як ви виявили, у вас може бути багато файлів, які чекають видалення), додайте -nпрапор, щоб mvнічого не переписати, але не запитаю вас про це:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

Ви також можете додати -vпрапор, щоб побачити, що робиться.

З будь-якою сумісною з POSIX mvоригінальною структурою каталогів все одно має бути недоторканою, так що ви також можете це перевірити - і просто видалити /media/admin/my_data... (Однак у загальному випадку, я думаю, що mv -nваріант є безпечним підходом - він обробляє всі форми mv, в тому числі , наприклад mv /media/admin/my_data/* my_data_on_60GB_partition/ .)

Можливо, вам буде потрібно відновити деякі дозволи; ви можете це зробити масово, використовуючи chownта chmod, або відновити їх із резервного копіювання за допомогою getfaclта setfacl(спасибі Сато Кацурі за нагадування ).


Дякую Стівен Кітт, ось величезна допомога! Я можу використовувати, findщоб знайти та встановити дозволи. У новому каталозі є багато файлів, які мають пробіли у файлах файлів, але прихованих файлів немає - про мене я знаю. Як ви думаєте, глобус у команді sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/розширить ім'я файлу без проблем розбиття слів? Я думав, що я можу використати, на sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/який я вважаю, що обробляє шляхи файлів з пробілами?
the_velour_fog

6
Щоб бути впевненим, коли такі випадки, як описані OP, я використовую rsyncнатомість, щоб він також перевіряв цілісність усіх файлів. Але приємно знати, що мені це не потрібно.
Hauleth

1
@the_velour_fog без проблем обробляє пробіли у файлах файлів.
Стівен Кітт

5
Я su command mv -i ...(або su /bin/mv -i ...) замість цього sudo mv -i ...), якщо якийсь (дивний) адміністратор зробив "mv" функцію, яка виконує "mv -f" на системному рівні (тобто / etc / profile або такі системні файли). . командувати щось: запустити команду somthing, а не функцію чи псевдонім з такою ж назвою. (Напр: один може бути (дуже) пощастило , і є (дуже, дуже погано)! function mv { /bin/mv -f -- "$@" }В файлі , який завжди соерсед, а потім «ГТ -i що - то» нічого не проситиме (і тільки заперечити , що «-i "файл не існує!) ... [я бачив такі речі ... тремтіння ]
Олів'є Дулак

3
@OlivierDulac - ідеальний приклад того, чому погана практика використовувати псевдоніми або сценарії з тими ж іменами, що і стандартні програми.
Джо

19

Після отримання відповіді Стівена Кітта та обговорення цієї команди як потенційного рішення:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

Я вирішив відмовитися від його запуску, поки я не оглянув те, що відбувається, ця відповідь описує те, що я з’ясував і в кінцевому підсумку робив.

Я використовую Gnu, mvякий копіює файли в ціль, тоді лише в разі успішної операції копіювання видаляється оригінал.
Однак я хотів підтвердити, чи mvвиконує ця послідовність один файл одночасно, якби це було правдою, оригінальний вміст папки був би чітко розрізаний на дві частини, одна частина зміщена до місця призначення, а інша все ще залишається в джерелі. І, можливо, був би один файл, який був перерваний під час копіювання, який був би спільним між двома каталогами - і він, ймовірно, буде неправильним.

Щоб виявити спільні файли між двома каталогами, я запустив:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

Цей результат припускав, що було 14 237 екземплярів одних і тих же файлів як у вихідному, так і в цільовому каталогах, я підтвердив, перевіривши файли вручну - так, було багато одних і тих же файлів в обох каталогах. Це говорить про те, що mvвидалення вихідних файлів виконує лише після копіювання великих зразків файлів. Показано швидке infoввімкнення mvкоманди

Він [ mv] спочатку використовує якийсь той самий код, який використовується cp -aдля копіювання запитуваних каталогів та файлів, потім (якщо припустити, що копія вдалася) видаляє оригінали. Якщо копія не вдається, то частина, яка була скопійована до розділу призначення, видаляється.

Я не виконував команду, але підозрюю, що намагався запустити

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

-i Рядок перед перезаписом , ймовірно , була б викликані більш ніж 14.000 раз.

Тоді потім з’ясуйте, скільки всього файлів у новоствореному каталозі:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

Тоді, якщо в новому каталозі було загалом 14238 звичайних файлів, а 14237 мали однакові оригінали назад у джерелі, це означає, що у новому каталозі був лише один файл, який не мав відповідного ідентичного файлу у джерелі. Щоб дізнатися, що це за файл, я повернув rsync назад у напрямку джерела:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

Швидка перевірка підтвердила, що це неправильно сформований файл, де файл існував як у вихідному, так і в цільовому, цільовому файлі = 64 МБ, оригінальний = 100 МБ. Цей файл та його ієрархія каталогів все ще належали root та ще не відновили оригінальні дозволи.

Отже, підсумовуючи:

  • всі файли, які mvніколи не дісталися, все ще повертаються у свої початкові місця (очевидно)
  • всі файли, які mvповністю копіювали, все ще мали свої оригінальні копії у вихідному каталозі
  • файл, який був лише частково скопійований, все ще мав оригінал назад у вихідному каталозі

Іншими словами, всі оригінальні файли залишалися недоторканими, і рішенням у цьому випадку було просто видалити новий каталог!


Нічого ... Я оновив свою відповідь, -nбуло б краще в загальному випадку. Я перевірив mvвихідний код, він видаляє джерело по одному аргументу за один раз.
Стівен Кітт

@StephenKitt ах приємно. Мені було цікаво, коли mvвідбувається видалення джерела. Таким чином, команда mv foo bar bazбуде рухатися fooв baz/foo тому видалити оригінал fooпотім перейти barдо baz/bar..?
the_velour_fog

Так, правильно; насправді саме це вказує POSIX (в основному так, що будь-яка помилка, що впливає на будь-який аргумент джерела, залишає всю ієрархію джерела неушкодженою).
Стівен Кітт

Я думаю, ти міг би використати diff, щоб знайти і той незакінчений файл.
StarWeaver

1
Вам слід скористатися, cmpа не diffпорівнювати двійкові файли. Також ваше обговорення вище має сенс лише під час переміщення файлів у різних файлових системах. При переміщенні файлів у межах однієї файлової системи немає копіювання.
Satō Katsura

4

Я просто подумав, що прокоментую, що деякі люди можуть спокусити кинути «мішки» в суміш, щоб паралельно вести речі. Це дає мені воллі, і мені дуже подобається рішення rsync вище.

Що стосується файлової системи щодо переміщення та копіювання, а коли точно видаляється оригінал, VFS та основна файлова система (и) координуються, щоб гарантувати атомність файлів, перш ніж перейти до цього етапу видалення. Тож навіть якщо він переривається до того, як цільовий файл буде повністю записаний, все блокування у VFS є реальним суворим і захищає від таких речей, як випадкове перемежування даних навіть у паралельних випадках. (Я працював над файлами Linux VFS та NFS4)

Додавання "xargs" до суміші, ймовірно, зробило б крок подвійної перевірки санітарності головним болем, з декількома файлами в середині транзиту. Я б хотів, щоб у мене було більше сценаріїв на рівні системи. Гарні нагадування для мене!

Полюбив питання, добре для павутини, і змушує мене знову полюбити rsync. Ура!


1
Не кажучи вже про проблеми, коли файли містять пробіл.
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.