Topik ini membahas penyalinan, pemindahan, dan penggantian nama berkas serta direktori dengan dua perintah, yaitu cp dan mv. Penyalinan menghasilkan berkas baru dengan isi yang sama, sedangkan pemindahan dan penggantian nama hanya mengubah penunjuknya tanpa menggandakan data. Setelah membacanya, kedua perintah dapat digunakan untuk berkas tunggal maupun untuk seluruh pohon direktori, termasuk mengenali perilaku penimpaan yang bekerja senyap.
Menyalin berkas dengan cp#
Perintah cp menyalin berkas dengan bentuk dasar cp sumber tujuan. Apabila tujuan berupa nama berkas yang belum ada, salinan baru dibuat dengan nama tersebut. Apabila tujuan berupa direktori, salinan diletakkan di dalam direktori itu dengan nama yang sama seperti aslinya. Beberapa berkas dapat disalin sekaligus dengan syarat tujuannya berupa direktori.
# siapkan direktori kerja yang bersih
rm -rf /tmp/kerja-menyalin-dan-memindahkan
mkdir -p /tmp/kerja-menyalin-dan-memindahkan
cd /tmp/kerja-menyalin-dan-memindahkan# siapkan berkas sumber
echo "kopi, gula, tepung" > daftar-belanja.txt
# salin berkas dengan nama baru
cp daftar-belanja.txt cadangan-belanja.txt
# salin berkas ke dalam direktori lain
mkdir serahan
cp daftar-belanja.txt serahan/
# tampilkan seluruh berkas yang ada
find ..
./daftar-belanja.txt
./serahan
./serahan/daftar-belanja.txt
./cadangan-belanja.txtHasilnya ada tiga berkas dengan isi yang sama, yaitu aslinya, salinan dengan nama baru di direktori yang sama, dan salinan di dalam serahan. Perintah find dipakai di sini untuk menampilkan seluruh berkas yang ada, termasuk yang berada di dalam subdirektori.
Penyalinan kedua atas tujuan yang sudah ada memperlihatkan sifat yang perlu diwaspadai.
# ubah isi berkas sumber
echo "kopi, gula, telur" > daftar-belanja.txt
# salin ulang tanpa pertanyaan apa pun
cp daftar-belanja.txt cadangan-belanja.txt
# salinan lama ternyata sudah tergantikan
cat cadangan-belanja.txtkopi, gula, telurTidak ada pertanyaan, peringatan, maupun pesan apa pun ketika salinan lama tergantikan, karena cp menimpa tujuan secara senyap selama izin menulisnya memungkinkan. Untuk berkas penting, opsi -i membuat cp bertanya lebih dahulu sebelum menimpa. Kebiasaan membaca isi tujuan setelah menyalin, sebagaimana dilakukan blok di atas, merupakan pemeriksaan yang murah namun berguna.
Menyalin direktori dengan cp -r#
Penyalinan direktori memerlukan opsi -r karena cp harus menelusuri seluruh isinya, bukan sekadar membaca satu berkas. Tanpa opsi tersebut, cp menolak permintaan itu dan menyatakan bahwa direktorinya dilewati. Blok berikut memperlihatkan penolakan tersebut terlebih dahulu, lalu cara yang benar.
# buat direktori contoh berisi dua berkas
mkdir proyek
echo "<h1>Halo</h1>" > proyek/index.html
echo "body { color: #222222; }" > proyek/gaya.css
# menyalin direktori tanpa opsi -r akan gagal
cp proyek salinan-proyekcp: -r not specified; omitting directory 'proyek'# -r menyalin direktori beserta seluruh isinya
cp -r proyek salinan-proyek
# isi salinan sama dengan aslinya
find salinan-proyeksalinan-proyek
salinan-proyek/index.html
salinan-proyek/gaya.cssPesan omitting directory berarti cp hanya memproses berkas, sedangkan direktori dilewatkan begitu saja. Dengan -r, cp menyalin proyek beserta dua berkas di dalamnya menjadi salinan-proyek. Bentuk tujuan menentukan hasilnya: cp -r proyek salinan-proyek menciptakan direktori baru bernama salinan-proyek, sedangkan cp -r proyek tujuan-yang-ada/ menyalin proyek ke dalam direktori itu sebagai subdirektorinya. Untuk keperluan cadangan, gunakan cp -a agar waktu perubahan, pemilik, dan izin berkas ikut dipertahankan, bukan hanya isinya.
Memindahkan dan mengganti nama dengan mv#
Perintah mv memindahkan berkas atau direktori ke tujuan baru, dan sekaligus berfungsi sebagai alat pengganti nama. Apabila sumber dan tujuan berada pada sistem berkas yang sama, mv hanya mengubah catatan nama di dalam direktori tanpa menyalin data, sehingga berkas sebesar apa pun selesai seketika. Berbeda dengan cp, mv tidak membedakan berkas dan direktori, sehingga tidak ada opsi rekursif yang perlu diingat.
# mengganti nama berkas dengan mv
mv cadangan-belanja.txt arsip-belanja.txt
# memindahkan berkas ke direktori lain
mv arsip-belanja.txt serahan/
# mv pada direktori tidak memerlukan opsi rekursif
mv salinan-proyek proyek-lama
# tampilkan keadaan akhir seluruh perpindahan
find ..
./daftar-belanja.txt
./proyek
./proyek/index.html
./proyek/gaya.css
./serahan
./serahan/daftar-belanja.txt
./serahan/arsip-belanja.txt
./proyek-lama
./proyek-lama/index.html
./proyek-lama/gaya.cssTiga operasi tuntas dalam satu blok: nama cadangan-belanja.txt diganti menjadi arsip-belanja.txt, berkas tersebut pindah ke dalam serahan, dan direktori salinan-proyek berganti nama menjadi proyek-lama. Isi berkas dan direktori tidak tersentuh sama sekali sepanjang perpindahan karena yang berubah hanyalah penunjuknya. Beberapa berkas juga dapat dipindahkan sekaligus dengan tujuan berupa direktori, misalnya mv a.txt b.txt serahan/.
Pola penamaan ulang dengan mv#
Penggantian nama massal biasanya dipadukan dengan perulangan shell dan parameter expansion (perluasan parameter), yaitu mekanisme shell untuk mengolah isi sebuah variabel. Ekspresi ${berkas%.log} menghasilkan isi variabel berkas tanpa akhiran .log, sehingga akhiran baru tinggal direkatkan. Blok berikut mengganti akhiran seluruh berkas .log menjadi .txt dalam satu langkah.
# siapkan tiga berkas log
touch a.log b.log c.log
# ganti akhiran .log menjadi .txt untuk setiap berkas
for berkas in *.log
do
mv "$berkas" "${berkas%.log}.txt"
done
# hasil penggantian akhiran
lsa.txt
b.txt
c.txt
daftar-belanja.txt
proyek
proyek-lama
serahanSetiap iterasi memproses satu nama dari hasil peluasan *.log, sehingga pola ini tetap bekerja untuk berapa pun jumlah berkasnya. Ekspresi % pada perluasan parameter membuang potongan terpendek yang cocok dari akhir nilai, sedangkan pasangannya ## membuang potongan terpanjang dari awal nilai. Karena itu, ${berkas##*/} menghasilkan nama berkas tanpa jalur direktorinya. Pola lain seperti ${berkas/lama/baru} mengganti bagian tengah nama. Perlu diingat bahwa mv di dalam perulangan sama senyapnya dengan mv biasa, yaitu menimpa berkas tujuan apabila namanya sudah ada.
Kesalahan umum#
Kesalahan pertama adalah lupa bahwa cp dan mv menimpa tujuan tanpa bertanya. Berkas lama yang tergantikan tidak dapat dikembalikan, dan kesalahan ini sering baru disadari setelah salinan cadangan ikut tertimpa. Untuk pekerjaan manual, opsi -i membuat kedua perintah meminta konfirmasi sebelum menimpa, sedangkan di dalam skrip, keberadaan tujuan sebaiknya diuji lebih dahulu dengan test -e tujuan.
Kesalahan kedua adalah menyalin direktori tanpa -r. Pesan omitting directory sering diabaikan padahal artinya tidak ada satu pun isi direktori yang tersalin. Perbaikannya jelas, yaitu menambahkan -r, atau menggunakan cp -a apabila atribut berkasnya perlu dipertahankan.
Kesalahan ketiga menganggap mv selalu selesai seketika. Apabila sumber dan tujuan berada pada sistem berkas yang berbeda, misalnya dari partisi home ke flashdisk, mv benar-benar menyalin datanya lalu menghapus sumbernya. Akibatnya, berkas besar memerlukan waktu, dan proses yang terputus meninggalkan salinan yang belum tuntas. Untuk perpindahan lintas perangkat yang besar, rsync lebih tahan gangguan karena dapat dilanjutkan dari titik berhentinya.
Ringkasan#
cp sumber tujuanmenggandakan berkas, dan menimpa tujuan secara senyap apabila tujuannya sudah ada.- Penyalinan direktori memerlukan
-r, sedangkancp -adipakai apabila atribut berkas perlu dipertahankan. - mv mengganti nama dan memindahkan dalam satu perintah yang sama, tanpa opsi rekursif, dan seketika pada sistem berkas yang sama.
- Penggantian nama massal dibangun dari perulangan
fordan perluasan parameter seperti${berkas%.log}.
Referensi#
- cp(1) — Debian manpages
— Opsi penyalinan termasuk
-rdan-abeserta perilaku penimpaan. - mv(1) — Debian manpages — Perilaku mv pada tujuan yang sudah ada dan pada sistem berkas yang berbeda.