Membuat dan menghapus sudah kita kuasai; kini kita tinggal memindahkan barangnya. Sebagian besar kerja terminal adalah mengatur letak file: menduplikasi konfigurasi sebagai cadangan, memindahkan hasil pekerjaan ke folder yang rapi, atau sekadar memperbaiki nama file yang salah ketik. Pada Chapter ini kita akan memakai cp untuk menyalin, mv untuk memindahkan sekaligus mengganti nama, lalu memverifikasi hasil salinan dengan diff. Satu bagian khusus membahas risiko terbesar kedua perintah ini: penimpaan file yang terjadi tanpa peringatan.
Menyalin file dengan cp dan memverifikasi hasilnya #
Perintah cp (*copy) membutuhkan minimal dua argument: sumber dan tujuan. Tujuan bisa berupa nama file baru atau path lengkap tempat salinan diletakkan. Kebiasaan baik yang layak dibangun sejak awal adalah memverifikasi salinan, dan untuk itu kita akan mengenal diff` — pembeda isi dua file baris demi baris:
mkdir -p proyek
printf "catatan penting\nbaris kedua\n" > proyek/catatan.txt
printf "catatan penting\nbaris diubah\n" > catatan-lama.txt
diff catatan-lama.txt proyek/catatan.txt
cp proyek/catatan.txt cadangan.txt
diff proyek/catatan.txt cadangan.txtOutput yang Dihasilkan:
2c2
< baris diubah
---
> baris keduaMari kita telaah baris-baris di atas:
- Baris 1-3 (
mkdirdanprintf): menyiapkan dua file yang isinya hanya beda satu baris —proyek/catatan.txtdancatatan-lama.txt. - Baris 4 (
diff catatan-lama.txt proyek/catatan.txt):diffmenemukan perbedaan pada baris 2 dan mencetak kedua versinya — baris bertanda<berasal dari file pertama, baris bertanda>dari file kedua. - Baris 5 (
cp proyek/catatan.txt cadangan.txt): membuat salinancadangan.txtdari file asli. - Baris 6 (
diff proyek/catatan.txt cadangan.txt): tidak mencetak apa pun karena kedua file identik — diamnyadiffadalah tanda bahwa salinan utuh.
Menyalin direktori dengan cp -r #
Perintah cp polos menolak direktori dengan pesan error, karena menyalin direktori berarti menyalin seluruh isinya dan cp minta kejelasan itu dinyatakan. Option -r (recursive) memberi pernyataan tersebut:
mkdir -p musik
printf "lirik lagu satu\n" > musik/lagu1.txt
printf "lirik lagu dua\n" > musik/lagu2.txt
cp -r musik musik-salinan
ls musik-salinanOutput yang Dihasilkan:
lagu1.txt
lagu2.txtBaris cp -r musik musik-salinan menduplikasi folder musik menjadi folder baru bernama musik-salinan lengkap dengan kedua file di dalamnya — ls pada baris terakhir membuktikan isinya ikut tersalin. Seluruh option cp lainnya, termasuk mode arsip -a, tercantum pada halaman manual cp(1)
. Bila tujuan sudah ada sebagai direktori, makna sedikit bergeser: cp -r musik musik-salinan justru menyalin musik ke dalam musik-salinan sehingga hasilnya musik-salinan/musik/. Detail kecil ini sering mengejutkan, jadi biasakan memeriksa dengan ls setelah menyalin.
Memindahkan dan mengganti nama dengan mv #
Perintah mv (move) sebenarnya menjalankan satu operasi saja: mengubah lokasi sebuah entri pada filesystem. Dari operasi tunggal itu lahir dua kegunaan yang terasa berbeda. Bila sumber dan tujuan berada di direktori yang sama, yang berubah hanyalah nama — itulah cara mengganti nama file di Linux. Bila direktorinya beda, file berpindah:
mkdir -p proyek/src
printf "catatan\n" > catatan.txt
mv catatan.txt catatan-final.txt
mv catatan-final.txt proyek/src/
ls proyek/srcOutput yang Dihasilkan:
catatan-final.txtMari kita telaah baris-baris di atas:
- Baris 3 (
mv catatan.txt catatan-final.txt): keduanya berada di direktori kerja yang sama, jadi operasi ini murni penggantian nama. - Baris 4 (
mv catatan-final.txt proyek/src/): tujuan adalah direktori, jadi file dipindahkan masuk ke dalamnya dengan nama yang tetap. - Baris 5 (
ls proyek/src): memastikan file kini berada di lokasi baru.
Menyalin lalu menghapus sumbernya — pendekatan yang terlintas pertama bagi banyak pemula — tidak diperlukan; mv selesai dalam satu langkah dan tidak menghabiskan ruang dua kali.
Menimpa file: risiko diam-diam #
Sekarang sisi gelapnya. Bila file tujuan sudah ada, baik mv maupun cp menimpa isinya tanpa bertanya dan tanpa peringatan — perilaku bawaan GNU coreutils pada sesi skrip. Mari kita lihat betapa senyapnya:
printf "isi lama\n" > tujuan.txt
printf "isi baru\n" > asal.txt
cat tujuan.txt
mv asal.txt tujuan.txt
cat tujuan.txtOutput yang Dihasilkan:
isi lama
isi baruSebelum mv, file tujuan.txt berisi isi lama; setelah mv, isinya menjadi isi baru dan file asal.txt lenyap — tidak ada satu baris konfirmasi pun di antaranya. Dua option melunakkan perilaku ini: -i (interactive) meminta jawaban y sebelum menimpa, dan -n (no-clobber) membatalkan penimpaan secara diam. Keduanya butuh keputusan di tengah jalan sehingga paling berguna di terminal interaktif; dalam skrip, pola yang lebih aman adalah memeriksa dulu dengan ls atau test -e tujuan sebelum menyalin.
Dengan salin dan pindah di tangan, folder kerja kita kini hidup: file datang, pergi, dan berpindah sesuai kebutuhan. Pertanyaan berikutnya adalah menemukan file yang kita butuhkan di tengah tumpukan itu — materi Chapter Mencari File dan Direktori.