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 mv
program mulai bergerak /media/admin/my_data
dan 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_partition
dan beberapa subdirektori dimiliki oleh root.
Saya berasumsi mv
program 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
sumber
Control-Z
(berhenti) daripadaControl-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. (Gunakankill -stop
untuk proses tidak dalam tty).(2GB + 47GB) < 60GB
. kapasitas partisi adalah 60GB, ukuran folder dan isinya: 49GB.Jawaban:
Ketika memindahkan file antar sistem file,
mv
tidak 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 - setidaknyamv
salinan 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
-i
bendera agarmv
tidak menimpa apa pun:(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-n
tanda sehinggamv
tidak menimpa apa pun tetapi tidak bertanya tentang hal itu:Anda juga dapat menambahkan
-v
bendera 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 pikirmv -n
varian adalah pendekatan aman - ia menangani semua bentukmv
, termasuk misalnyamv /media/admin/my_data/* my_data_on_60GB_partition/
.)Anda mungkin perlu mengembalikan beberapa izin; Anda dapat melakukannya secara massal menggunakan
chown
danchmod
, atau mengembalikannya dari cadangan menggunakangetfacl
dansetfacl
(terima kasih kepada Sato Katsura untuk pengingatnya ).sumber
find
untuk 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 perintahsudo 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 menggunakansudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/
yang saya yakin akan menangani path file dengan spasi?rsync
sebagai gantinya, jadi itu juga akan memeriksa integritas semua file. Tapi senang mengetahui bahwa saya tidak membutuhkan itu.su command mv -i ...
(atausu /bin/mv -i ...
), alih-alihsudo 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 ]Setelah mendapatkan jawaban Stephen Kitt dan mendiskusikan perintah ini sebagai solusi potensial:
Saya memutuskan untuk menunda menjalankannya sampai saya mengetahui apa yang terjadi, jawaban ini menjelaskan apa yang saya temukan dan akhirnya lakukan.
Saya menggunakan Gnu
mv
yang menyalin file ke target, maka hanya jika operasi salin berhasil, itu menghapus yang asli.Namun saya ingin mengkonfirmasi apakah
mv
melakukan 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:
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
mv
salinan petak besar file yang melakukan penghapusan file sumber. Pencarian cepatinfo
padamv
perintah munculSaya tidak menjalankan perintah tetapi saya curiga jika saya mencoba menjalankannya
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:
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:
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:
mv
tidak pernah dijangkau masih kembali ke lokasi aslinya (jelas)mv
melakukan penyalinan sepenuhnya masih memiliki salinan aslinya di direktori sumberDengan kata lain semua file asli masih utuh dan solusi dalam hal ini adalah dengan menghapus direktori baru!
sumber
-n
akan lebih baik dalam kasus umum. Saya memeriksamv
kode sumber, menghapus argumen sumber satu per satu.mv
penghapusan pada sumbernya. Jadi perintahmv foo bar baz
akan pindahfoo
untukbaz/foo
kemudian menghapus yang aslifoo
lalu pindahbar
kebaz/bar
..?cmp
daripadadiff
membandingkan 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.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!
sumber