Salin file di Linux, hindari salinan jika file ada di tujuan


32

Saya perlu menyalin folder / home / pengguna dari satu hard disk ke yang lain. Ini memiliki 100.000 file dan ukuran sekitar 10G.

saya menggunakan

cp -r /origin /destination

terkadang saya mendapatkan beberapa kesalahan karena tautan yang rusak, izin dan sebagainya. Jadi saya memperbaiki kesalahan, dan perlu memulai lagi salinannya.

Saya bertanya-tanya bagaimana saya bisa memberi tahu perintah "cp", setelah mencoba menyalin lagi, tidak menyalin file lagi jika ada di folder tujuan.


2
Jangan kita cp. Gunakan rsync sebagai gantinya.
William Pursell

Jawaban:


22

cp -R -u -p /source /destination

The -u( atau--update ) flag tidak hanya ini:

Dari halaman manual untuk cp:

-u, --update

salin hanya ketika file SOURCE lebih baru dari file tujuan atau ketika file tujuan hilang


6
Untuk benar-benar hanya menyalin file yang tidak ada dan tidak memperbarui yang sudah ada, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, --perbarui salin hanya ketika file SOURCE lebih baru dari file tujuan atau ketika file tujuan hilang -u, --perbarui salin hanya ketika file SOURCE lebih baru dari file tujuan atau ketika file tujuan hilang -p sama dengan --preserve = mode, kepemilikan, cap waktu --preserve [= ATTR_LIST] mempertahankan atribut yang ditentukan (default: mode, kepemilikan, stempel waktu), jika mungkin atribut tambahan: konteks, tautan, xattr, semua
Covich

51

Gunakan saja cp -n <source> <dest>.

Dari halaman manual :

-n, --no-clobber

JANGAN menimpa file yang ada (menimpa opsi -i sebelumnya)


7
Ini adalah satu-satunya jawaban yang benar untuk pertanyaan itu.
sebix

20

rsync -aq /src /dest

Selain hanya menyalin file yang lebih baru, bahkan hanya akan menyalin bagian file yang lebih baru jika file telah berubah. Ini dimaksudkan untuk menyalin melalui tautan jaringan di mana Anda ingin meminimalkan jumlah data - tetapi juga berfungsi dengan baik secara lokal.


Saya tidak dapat menambahkan pemformatan `` ke posting Anda karena hanya dua karakter. Bagaimana perasaan Anda tentang mengedit ini dan menambahkan karakter `` di sekitar perintah Anda?
Culix

4

Cari opsi "-u" untuk cpperintah.


2
Tidak setuju bahwa menggunakan -u adalah ide yang bagus. -u salinan hanya ketika sumber lebih baru atau tujuan hilang. Masalah poster asli disebabkan oleh pemecahan salinan file dengan alasan apa pun. Karena itu OP akan memiliki file setengah tertulis yang tidak diperbarui saat menjalankan kembali salinan. File itu mungkin penting bagi seseorang! rsync memecahkan masalah ini.
hazymat

2

Semua jawaban di atas benar tetapi jika Anda melakukan ini secara rekursif maka

kamu seharusnya melakukan:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

Anda harus menyalin sebagai root untuk mempertahankan izin / kepemilikan

# cp -au

Lihat juga rsync


1

Solusi POSIX

Jawaban lain menggunakan -u atau -nopsi dari cp. Tidak satu pun dari ini diperlukan oleh POSIX ; juga bukan rsyncdari jawaban lain; juga tidak yesdigunakan dalam salah satu komentar.

Masih kita bisa mereproduksi yes ndengan whileloop. Ini mengarah ke solusi POSIX berikut:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

Menggunakan cp -rn <sourcedirname>/. <destdirname>

Saklar r membuat salinan menjadi rekursif di atas direktori.

N switch (versi lama tanpa clobber) memastikan file yang ada tidak pernah ditulis berlebihan.

The ' /.' setelah sourcedirname memastikan bahwa itu tidak menjadi subdirektori di bawah destdirname alih-alih semua konten dari yang sebelumnya disalin ke yang terakhir.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.