Saya baru saja "mv" mengedit direktori 49GB ke jalur file yang buruk, apakah mungkin untuk mengembalikan keaslian file?

58

Saya punya (well, saya punya ) direktori:

/media/admin/my_data

Ukurannya sekitar 49GB dan memiliki puluhan ribu file di dalamnya. Direktori adalah titik pemasangan partisi LUKS yang aktif.

Saya ingin mengganti nama direktori menjadi:

/media/admin/my_data_on_60GB_partition

Saya tidak menyadarinya pada saat itu, tetapi saya mengeluarkan perintah dari direktori home jadi saya akhirnya melakukan:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

Maka mvprogram mulai bergerak /media/admin/my_datadan isinya ke direktori baru ~/my_data_on_60GB_partition.

Saya menggunakan Ctrl+ Cuntuk membatalkan bagian perintah, jadi sekarang saya memiliki banyak file yang dibagi di direktori:

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

dan

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

Direktori baru ~/my_data_on_60GB_partitiondan beberapa subdirektori dimiliki oleh root.
Saya berasumsi mvprogram tersebut harus menyalin file sebagai root pada awalnya dan kemudian setelah transfer chown, mereka kembali ke akun pengguna saya.

Saya memiliki cadangan direktori / partisi yang agak lama.
Pertanyaan saya adalah, apakah mungkin untuk mengembalikan banyak file yang dipindahkan dengan andal?

Yaitu, bisakah saya jalankan saja:

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

atau haruskah saya berhenti mencoba memulihkan, karena file mungkin rusak dan sebagian selesai, dll?

  • OS - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25
the_velour_fog
sumber
36
Biasakan saat panik untuk mengetik Control-Z(berhenti) daripada Control-C. Dalam hal ini, Anda kemudian dapat melihat file mana yang sedang ditransfer pada waktu itu dan mengetahui file mana yang hanya disalin sebagian. Anda kemudian dapat memutuskan dengan tenang bagaimana melanjutkan. (Gunakan kill -stopuntuk proses tidak dalam tty).
meuh
1
2GB + 47GB = 60GB ???
tbodt
7
@tbodt (2GB + 47GB) < 60GB. kapasitas partisi adalah 60GB, ukuran folder dan isinya: 49GB.
the_velour_fog

Jawaban:

87

Ketika memindahkan file antar sistem file, mvtidak menghapus file sebelum selesai menyalinnya, dan memproses file secara berurutan (awalnya saya mengatakan itu menyalin kemudian menghapus setiap file secara bergantian, tapi itu tidak dijamin - setidaknya mvsalinan GNU kemudian menghapus setiap perintah- argumen baris pada gilirannya, dan POSIX menentukan perilaku ini ). Jadi Anda harus memiliki paling banyak satu file tidak lengkap di direktori target, dan aslinya masih di direktori sumber.

Untuk memundurkan sesuatu, tambahkan -ibendera agar mvtidak menimpa apa pun:

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

(dengan asumsi Anda tidak memiliki file tersembunyi untuk dipulihkan dari ~/my_data_on_60GB_partition/), atau lebih baik lagi (mengingat bahwa, ketika Anda menemukan, Anda bisa memiliki banyak file yang menunggu untuk dihapus), tambahkan -ntanda sehingga mvtidak menimpa apa pun tetapi tidak bertanya tentang hal itu:

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

Anda juga dapat menambahkan -vbendera untuk melihat apa yang sedang dilakukan.

Dengan setiap POSIX-compliant mv, struktur direktori asli masih harus utuh, jadi Anda bisa mengeceknya - dan cukup hapus /media/admin/my_data... (Dalam kasus umum, saya pikir mv -nvarian adalah pendekatan aman - ia menangani semua bentuk mv, termasuk misalnya mv /media/admin/my_data/* my_data_on_60GB_partition/ .)

Anda mungkin perlu mengembalikan beberapa izin; Anda dapat melakukannya secara massal menggunakan chowndan chmod, atau mengembalikannya dari cadangan menggunakan getfacldan setfacl(terima kasih kepada Sato Katsura untuk pengingatnya ).

Stephen Kitt
sumber
Terima kasih Stephen Kitt, itu sangat membantu! Saya dapat menggunakan finduntuk menemukan dan mengatur izin. Ada banyak file di direktori baru yang memiliki spasi di nama file, tetapi tidak ada file tersembunyi - yang saya tahu. Apakah Anda pikir glob dalam perintah sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/akan memperluas nama file tanpa masalah pemisahan kata? Saya berpikir sebagai alternatif saya bisa menggunakan sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/yang saya yakin akan menangani path file dengan spasi?
the_velour_fog
6
Hanya untuk memastikan, ketika hal-hal seperti OP dijelaskan terjadi, saya menggunakan rsyncsebagai gantinya, jadi itu juga akan memeriksa integritas semua file. Tapi senang mengetahui bahwa saya tidak membutuhkan itu.
Hauleth
1
@the_velour_fog globbing menangani spasi dalam nama file tanpa masalah.
Stephen Kitt
5
Saya akan su command mv -i ...(atau su /bin/mv -i ...), alih-alih sudo mv -i ...), dalam kasus beberapa admin (aneh) membuat "mv" fungsi yang melakukan "mv -f" di tingkat sistem (yaitu, / etc / profile atau file sistem lebar tersebut). Perintah sesuatu: mulai perintah sesuatu, dan bukan fungsi atau alias dengan nama yang sama. (misalnya: seseorang bisa (sangat!) tidak beruntung dan memiliki (sangat, sangat buruk!) function mv { /bin/mv -f -- "$@" }dalam file yang selalu bersumber, dan kemudian "rm -i sesuatu" tidak akan meminta apa-apa (dan hanya memprotes bahwa "-i "File tidak ada!) ... [Saya telah melihat hal-hal seperti itu ... menggigil ]
Olivier Dulac
3
@OlivierDulac - contoh sempurna mengapa praktik buruk menggunakan alias atau skrip dengan nama yang sama dengan program standar.
Joe
19

Setelah mendapatkan jawaban Stephen Kitt dan mendiskusikan perintah ini sebagai solusi potensial:

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

Saya memutuskan untuk menunda menjalankannya sampai saya mengetahui apa yang terjadi, jawaban ini menjelaskan apa yang saya temukan dan akhirnya lakukan.

Saya menggunakan Gnu mvyang menyalin file ke target, maka hanya jika operasi salin berhasil, itu menghapus yang asli.
Namun saya ingin mengkonfirmasi apakah mvmelakukan urutan file ini satu per satu, jika itu benar, isi folder asli akan dengan bersih telah diiris menjadi dua bagian, satu bagian bergeser ke tujuan, yang lain masih tertinggal di sumbernya. Dan mungkin ada satu file yang terputus selama penyalinan yang biasa terjadi di antara dua direktori - dan kemungkinan akan salah.

Untuk menemukan file yang umum di antara dua direktori, saya berlari:

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

Hasil ini menyarankan ada 14.237 contoh file yang sama di direktori sumber dan target, saya konfirmasikan dengan memeriksa file secara manual - ya ada banyak file yang sama di kedua direktori. Ini menunjukkan bahwa hanya setelah mvsalinan petak besar file yang melakukan penghapusan file sumber. Pencarian cepat infopada mvperintah muncul

Ini [ mv] pertama-tama menggunakan beberapa kode yang sama yang digunakan oleh cp -auntuk menyalin direktori dan file yang diminta, kemudian (dengan asumsi salinan berhasil) menghapus kode aslinya. Jika salinan gagal, maka bagian yang disalin ke partisi tujuan dihapus.

Saya tidak menjalankan perintah tetapi saya curiga jika saya mencoba menjalankannya

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

The -i cepat sebelum menimpa kemungkinan akan memicu lebih dari 14.000 kali.

Maka untuk mengetahui berapa banyak total file dalam direktori yang baru dibuat:

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

Jadi jika ada total 14238 file biasa di direktori baru dan 14237 memiliki dokumen asli yang sama kembali di sumbernya, itu berarti hanya ada satu file di direktori baru yang tidak memiliki file identik yang sesuai kembali pada sumbernya. Untuk mengetahui apa file itu, saya menjalankan rsync kembali ke arah sumber:

~% 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)

Pemeriksaan cepat mengkonfirmasi bahwa ini adalah file salah bentuk, di mana file tersebut ada pada sumber dan tujuan, file tujuan = 64MB, asli = 100MB. File ini dan hierarki direktori-nya masih dimiliki oleh root dan belum mengembalikan izin aslinya.

Jadi dalam ringkasan:

  • semua file yang mvtidak pernah dijangkau masih kembali ke lokasi aslinya (jelas)
  • semua file yang mvmelakukan penyalinan sepenuhnya masih memiliki salinan aslinya di direktori sumber
  • file yang hanya disalin sebagian masih memiliki aslinya di direktori sumber

Dengan kata lain semua file asli masih utuh dan solusi dalam hal ini adalah dengan menghapus direktori baru!

the_velour_fog
sumber
Wow ... Saya sudah memperbarui jawaban saya, -nakan lebih baik dalam kasus umum. Saya memeriksa mvkode sumber, menghapus argumen sumber satu per satu.
Stephen Kitt
@StephenKitt ah bagus. Saya bertanya-tanya kapan mvpenghapusan pada sumbernya. Jadi perintah mv foo bar bazakan pindah foountuk baz/foo kemudian menghapus yang asli foolalu pindah barke baz/bar..?
the_velour_fog
Ya itu betul; sebenarnya itulah yang ditentukan POSIX (pada dasarnya, sehingga setiap kesalahan yang mempengaruhi argumen sumber apa pun membuat seluruh hierarki sumber utuh).
Stephen Kitt
Saya pikir Anda bisa menggunakan diff untuk menemukan satu file yang belum selesai juga.
StarWeaver
1
Anda harus menggunakan cmpdaripada diffmembandingkan file biner. Juga, diskusi Anda di atas hanya masuk akal ketika memindahkan file di berbagai sistem file. Tidak ada penyalinan yang terlibat saat memindahkan file dalam sistem file yang sama.
Satō Katsura
4

Saya hanya berpikir saya akan berkomentar bahwa beberapa orang mungkin tergoda untuk melemparkan 'xargs' ke dalam campuran untuk menjalankan berbagai hal secara paralel. Itu memberi saya semangat dan saya sangat suka solusi rsync di atas.

Mengenai hal-hal filesystem tentang pemindahan dan penyalinan dan ketika persis yang asli dihapus, VFS dan filesystem yang mendasarinya berkoordinasi untuk menjamin atomicity per-file sebelum sampai ke langkah penghapusan. Jadi, bahkan jika itu terputus sebelum file target sepenuhnya ditulis, semua penguncian dalam VFS benar-benar ketat dan melindungi terhadap hal-hal seperti interleaving data acak bahkan dalam kasus paralel. (Saya bekerja pada hal-hal Linux VFS dan NFS4)

Menambahkan 'xargs' ke dalam campuran mungkin akan membuat langkah pemeriksaan kewarasan ganda menjadi sakit kepala, dengan beberapa file sedang transit. Saya berharap saya memiliki lebih banyak scripting tingkat sistem. Pengingat yang baik untuk saya!

Mencintai pertanyaan, baik untuk sarang laba-laba, dan membuat saya suka rsync lagi. Tepuk tangan!

david richter
sumber
1
Belum lagi masalah ketika nama file mengandung spasi.
Wildcard