Perintah cp Linux: salin file, direktori, dan kendalikan penimpaan

Perintah cp menyalin file ke nama atau lokasi lain; gunakan -R untuk direktori beserta isinya dan -a untuk mempertahankan tautan serta atribut yang didukung. Periksa apakah tujuan sudah berupa direktori karena kondisi itu menentukan lokasi salinan dan apakah file yang ada dapat tertimpa.

Contoh menggunakan perilaku GNU Coreutils. Periksa cp --help, man cp, dan dokumentasi distribusi Anda ketika portabilitas atau opsi spesifik versi penting.

Apa Itu Perintah cp?

Salinan file biasa dapat diubah tanpa mengubah isi sumber. Biasanya salinan baru memiliki inode, yaitu identitas metadata file, yang berbeda. Pada kloning copy-on-write, blok penyimpanan dapat dipakai bersama sampai salah satu file diubah; kemandirian isi secara logis tidak berarti dua salinan fisik yang terpisah dari risiko kerusakan media.

Sintaks Dasar

cp [OPSI]... [-T] SUMBER TUJUAN
cp [OPSI]... SUMBER... DIREKTORI
cp [OPSI]... -t DIREKTORI SUMBER...

Kutip jalur yang mengandung spasi. Pada GNU, cp -- -catatan.txt salinan.txt menangani nama sumber yang diawali tanda hubung. Periksa cp --version dan cp --help karena opsi serta status ketika salinan dilewati dapat berbeda antar versi.

Penggunaan dasar cp

Salin file ke nama baru

Jalankan latihan di direktori baru milik Anda, misalnya masuk dengan cd ke direktori hasil mktemp -d. Siapkan sumber dengan printf 'laporan\n' > report.txt. Jika report-backup.txt belum ada, contoh membuatnya; jika sudah berupa file biasa yang dapat ditulisi, GNU cp biasanya menimpa isinya tanpa bertanya.

cp report.txt report-backup.txt

Salin beberapa file ke dalam direktori

Pastikan index.html dan style.css ada, lalu buat direktori tujuan dengan mkdir public jika belum tersedia. Ketika beberapa sumber diberikan, operand terakhir harus berupa direktori tujuan yang sudah ada.

cp index.html style.css public/

Hasilnya public/index.html dan public/style.css. cp tidak otomatis membuat rantai direktori induk yang hilang untuk tujuan file; siapkan struktur yang diperlukan sebelum menyalin.

Menyalin pohon direktori

Gunakan direktori sumber src dan app yang sudah ada. -R menyalin pohon direktori, sedangkan -a juga berupaya mempertahankan atribut. Untuk mengamati bentuk hasil pertama kali, nama src-copy dan app-backup harus belum ada.

cp -R src src-copy
cp -a app/ app-backup/

Jika tujuan belum ada, src/file.txt menjadi src-copy/file.txt, dan app/config.ini menjadi app-backup/config.ini. Jika tujuan sudah berupa direktori, pemanggilan yang sama dapat membuat lapisan tambahan seperti app-backup/app/config.ini. Garis miring akhir pada app/ tidak boleh dianggap memiliki aturan “salin isi saja” seperti pada alat lain.

Memeriksa apakah file yang disalin sama

cp biasanya tidak mengeluarkan apa pun bahkan jika berhasil. Untuk operasi salin yang penting, periksa tidak hanya keberadaan file target, tetapi juga isinya.

printf 'demo\n' > original.txt &&
cp original.txt copy.txt &&
cmp -s original.txt copy.txt
printf '%s\n' "$?"

Dengan nama latihan yang dapat ditulisi, keluaran 0 berarti penyiapan, penyalinan, dan perbandingan berhasil. Operator && mencegah pemeriksaan salinan lama setelah langkah sebelumnya gagal. GNU cmp sendiri memakai status 0 untuk isi sama, 1 untuk berbeda, dan lebih dari 1 untuk kesalahan. Metadata tidak dibandingkan; gunakan stat untuk mode, pemilik, dan waktu bila perlu.

Opsi utama

Opsi Tujuan
-R, -r Salin direktori secara rekursif.
-a Mode arsip: lakukan rekursi dan pertahankan tautan serta atribut jika memungkinkan.
-p Pertahankan mode, kepemilikan, dan cap waktu jika memungkinkan.
-i Minta konfirmasi sebelum menimpa tujuan yang sudah ada.
-n Lewati file tujuan yang sudah ada; periksa perilaku status dan anjuran versi GNU yang dipakai.
-u Salin bila tujuan belum ada atau sumber lebih baru berdasarkan waktu modifikasi; bukan perbandingan isi.
-T Perlakukan tujuan sebagai jalur tepat, bukan direktori.
-t DIR Tentukan direktori target sebelum daftar sumber.
--reflink[=WHEN] Minta kloning copy-on-write; auto dapat beralih ke salinan biasa, sedangkan always gagal bila kloning tidak didukung.

Opsi panjang sering membuat skrip yang diperiksa lebih mudah dipahami. Ketika skrip harus dijalankan di sistem non-GNU, verifikasi setiap opsi non-POSIX di platform target.

Contoh praktis

Kontrol penimpaan

Siapkan direktori backup, file config.ini, serta setidaknya satu file berakhiran .conf. Jika backup/config.ini sudah ada, -i meminta keputusan sebelum menimpanya. Jawaban yang tidak menyetujui penimpaan mempertahankan file itu; periksa hasil dan status pada versi yang dipakai.

cp -iv config.ini backup/
cp -nv *.conf backup/

Ekspansi *.conf dilakukan oleh shell; bila tidak ada kecocokan pada Bash dengan pengaturan biasa, pola itu dapat diteruskan secara harfiah lalu menyebabkan kesalahan. -n melewati tujuan yang sudah ada, sehingga status berhasil belum membuktikan semua sumber tersalin.

Manual GNU saat ini menandai -n sebagai usang karena perbedaan status keluar antar platform. Pada versi yang mendukungnya, --update=none melewati tujuan lama tanpa menyebabkan status gagal, sedangkan --update=none-fail memberi diagnostik dan status gagal untuk salinan yang dilewati. Versi lama belum tentu menerima bentuk tersebut; jangan mengganti opsi sebelum memeriksa --help.

Pertahankan atribut untuk salinan cadangan

Mode arsip -a setara dengan rekursi, tidak mengikuti tautan sumber, dan mempertahankan atribut yang didukung. Daftar kontrol akses (ACL), atribut tambahan (extended attributes atau xattr), label Security-Enhanced Linux (SELinux), dan kepemilikan bergantung pada hak serta sistem file.

Contoh /etc/myapp dan /backup bersifat ilustratif: sumber serta induk tujuan harus tersedia, dan /backup/myapp belum ada bila ingin salinan langsung pada nama itu. Gunakan sudo hanya jika izin yang dibutuhkan memang memerlukan hak administrator. Pada contoh kedua, source harus ada dan destination belum ada untuk tata letak yang sama.

sudo cp -a /etc/myapp/ /backup/myapp/
cp -a --preserve=all source/ destination/

GNU -a dapat mengabaikan kegagalan mempertahankan konteks SELinux atau xattr tanpa mengubah status keluar. Keberhasilan perintah bukan bukti bahwa setiap atribut identik. Periksa kebutuhan pemulihan dengan stat, serta getfacl atau getfattr jika atribut itu digunakan dan alatnya tersedia.

Memilih perilaku tautan simbolik

Tanpa rekursi, GNU cp biasanya mengikuti tautan sumber ke file target. Pada penelusuran rekursif GNU, tautan sumber secara default disalin sebagai tautan. Gunakan -P untuk tidak mengikuti tautan sumber, -L untuk mengikuti semuanya, atau -H untuk mengikuti tautan yang disebut pada baris perintah saja. Pilihan terakhir yang berlaku dapat menggantikan pilihan sebelumnya.

Misalnya, cp -RP -- src src-links menyalin pohon tanpa mengikuti tautan sumber, sedangkan cp -RL -- src src-targets mengikuti targetnya. Gunakan nama tujuan baru agar tata letaknya jelas. Opsi tersebut mengatur tautan sumber, bukan jaminan perlindungan terhadap semua tautan pada tujuan. Periksa direktori tujuan yang akan Anda tulisi.

Verifikasi salinan penting

Untuk file penting, bandingkan hash kriptografis, yaitu ringkasan isi byte. Siapkan pasangan file yang sudah disalin, misalnya cp source.img copied.img, dan pasangan direktori, misalnya cp -R source-dir copied-dir dengan tujuan belum ada. Ganti nama contoh dengan sumber dan hasil salinan Anda.

sha256sum source.img copied.img
diff -qr source-dir copied-dir

Nilai hash SHA-256 pada kedua baris harus sama, bukan nama filenya. Status 0 dari sha256sum hanya menunjukkan pembacaan dan perhitungan berhasil; Anda tetap perlu membandingkan nilainya. GNU diff -qr tidak mencetak perbedaan dan mengembalikan 0 bila isi yang dibandingkan sama, 1 bila berbeda, atau 2 bila ada masalah. Pemeriksaan ini tidak menggantikan verifikasi seluruh atribut. Untuk data aktif yang berubah selama penyalinan, gunakan snapshot atau prosedur cadangan yang sesuai aplikasinya.

Perintah cp dan yang Terkait

Perintah atau metode Peran utama Penggunaan yang sesuai
cp Menyalin file dan direktori lokal Salinan langsung
mv Memindahkan atau mengganti nama jalur Sumber tidak boleh tetap ada
rsync Sinkronisasi inkremental dan jarak jauh Transfer besar yang berulang atau melalui jaringan
install Menyalin sambil mengatur atribut Instalasi dan penyebaran program

Peringatan Penting

Jenis tujuan mengubah hasil

GNU cp -RT src tujuan memperlakukan tujuan sebagai lokasi pohon secara langsung; direktori tujuan yang sudah ada dapat digabung isinya, bukan otomatis diganti seluruhnya. cp -t public -- index.html style.css secara eksplisit menempatkan dua file ke direktori public yang sudah ada. Kedua opsi itu tidak dengan sendirinya mencegah penimpaan file.

Mode arsip bukan sistem pencadangan lengkap

File terbuka, basis data aktif, izin, dan fitur sistem file yang tidak didukung dapat mencegah salinan yang konsisten. Uji pemulihan dengan alur kerja cadangan yang tepat.

Shell glob dapat mengabaikan entri tersembunyi

Pola source/* biasanya mengecualikan nama berawalan titik. Untuk menyalin isi direktori, termasuk entri tersembunyi, GNU cp -a source/. destination/ dapat dipakai setelah memeriksa kedua jalur. Pada tujuan lama, ini dapat menggabungkan isi dan menimpa file yang namanya sama; bukan sinkronisasi yang menghapus file tambahan pada tujuan.

Pertanyaan yang Sering Diajukan

Haruskah saya menggunakan -R atau -a untuk sebuah direktori?

Gunakan -R untuk rekursi dasar dan -a ketika mempertahankan tautan dan metadata yang didukung penting.

Bagaimana cara mencegah menimpa file yang sudah ada?

GNU menyediakan -n, tetapi manual saat ini menyarankan pilihan --update yang lebih jelas pada versi yang mendukungnya. Periksa --update=none dan --update=none-fail sesuai kebutuhan status, lalu verifikasi hasilnya.

Mengapa direktori yang disalin muncul pada kedalaman yang berbeda dari yang diharapkan?

Hasil tergantung pada apakah tujuan ada dan apakah dianggap sebagai direktori. Gunakan -T atau -t untuk menghilangkan ambiguitas.

Bagaimana cara memverifikasi salinan?

Bandingkan hash untuk file dan gunakan alat seperti diff -qr untuk pohon direktori. Cadangan nyata juga membutuhkan uji pemulihan.

Dokumentasi resmi

Referensi perintah Linux menurut tugas (bahasa Inggris) memberi konteks pengelolaan file dan direktori.