Saya punya banyak file dan direktori dalam subdirektori yang ingin saya pindahkan ke direktori induk. Sudah ada beberapa file dan direktori di direktori target yang perlu ditimpa. File yang hanya ada di target harus dibiarkan tidak tersentuh. Bisakah saya memaksakan mv
untuk melakukan itu? Itu ( mv * ..
) mengeluh
mv: cannot move `xyz' to `../xyz': Directory not empty
Apa yang saya lewatkan?
shell
command-line
rename
EricSchaefer
sumber
sumber
mv -f
?mv -f
jawaban itu tidak benar.Jawaban:
Anda harus menyalinnya ke tujuan dan kemudian menghapus sumbernya, menggunakan perintah yang
cp -r * ..
diikuti olehrm -rf *
.Saya tidak berpikir Anda dapat "menggabungkan" direktori menggunakan
mv
.sumber
mv
lebih cepat karena Anda berada di sistem file yang sama? Bagaimana jika Anda menggunakancp -l
untuk membuat hardlink daripada benar-benar memindahkan file?cp -a
alih-alihcp -r
untuk mempertahankan atribut file (cap waktu, izin, dll.).cp -rl source destination && rm -r source
.rsync
mungkin akan menjadi pilihan yang lebih baik di sini. Sesederhana itursync -a subdir/ ./
.Pohon tes saya dalam
filename
:contents
format:Berlari
rsync
:Memberi:
Dan kemudian, untuk meniru
mv
, Anda mungkin ingin menghapus direktori sumber:Memberi:
Jika ini salah, dapatkah Anda memberikan contoh serupa (mis. Menggunakan pohon pengujian saya dari dekat bagian atas jawaban ini) dengan hasil yang diinginkan?
sumber
rm -r
pada akhirnya untuk membuatnya pada dasarnya sama denganmv
.mv
bersifat atomik, mempertahankan nomor inode (agar file dapat tetap terbuka), dan tidak memerlukan waktu dan ruang untuk membuat salinan.cp -r; rm -r
. Saya pikir dalam pengertian itu,rsync
layak disebut juga.rsync
dapat menghapus sumber setelah salinan dengan--remove-source-files
parameter. Ini harus menjadi cara yang nyaman untuk melakukan apa yang Anda inginkan.Dari
rsync man page
:sumber
cp -r; rm
karena kurangnya ruang kosong. Alih-alihrsync --remove-source-files
kedua ruang disk yang diperkecil dihindari menghindari menyalin file yang sama persis.Anda dapat melakukan ini dengan
cp
danrm
, tetapi tanpa menyalin sejumlah besar data Anda (mungkin) berusaha menghindari transfer. @mattdm menyinggung ini dalam komentarnya , dan jawaban untuk pertanyaan lain memiliki diskusi yang lebih lengkap tentang berbagai opsi.Pada dasarnya,
-l
opsi untukcp
perintah ini menciptakan tautan keras ke file daripada menyalin data mereka ke file baru.sumber
cp -al source destination
untuk menjaga info dan izin pemilik.cp
menimpa secara default. The-f
pilihan mencoba untuk menghapus file (seperti dalamrm
) sebelum mencoba untuk menyalin lagi, yang dapat membantu jika proses tidak dapat membuka file untuk menulis, meskipun beberapa orang akan lebih memilih untuk melihat bahwa ada kesalahan sebagai gantinya. Saya tidak tahu apakah itu penting bagi OP, tetapi saya tetap menambahkan-f
bendera pada jawaban saya.Berikut ini skrip yang memindahkan file dari bawah
/path/to/source/root
ke jalur yang sesuai di bawah/path/to/destination/root
.Hati-hati, kode yang belum diuji.
sumber
\;
sebelum-o
di baris pertama darifind
perintah, dan Anda tidak harus melarikan diri!
diif
- itu hanya!
, tidak\!
Utas ini sudah ada selama bertahun-tahun dan masih menempati peringkat # 1 di google jadi saya ingin menambahkan metode lain. Bagaimana saya biasanya melakukan ini: mengemas konten subdir ke dalam tarball, memindahkan tarball ke direktori induk dan kemudian mengekstraknya dengan perilaku default --overwrite. Ini tepat seperti yang Anda cari. Setelah itu, Anda dapat menghapus subdir.
sumber
Jika Anda memiliki cukup penyimpanan, Anda dapat melakukannya dengan cara berikut:
Pastikan tidak ada file penting dengan tanda ~ di ujungnya, tetapi jika ada, Anda dapat menambahkan
--suffix=whateveryouwant
alih-alih default.sumber