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.

Buka jalannya
sumber
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

pengguna31894
sumber
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)

Balmipour
sumber
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.

Martin Beckett
sumber
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.

Runcing
sumber
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
grepit
sumber
1

Anda harus menyalin sebagai root untuk mempertahankan izin / kepemilikan

# cp -au

Lihat juga rsync

pixelbeat
sumber
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
Kamil Maciorowski
sumber
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.

taatparya
sumber