Membuat dan Menghapus

Membuat dan menghapus berkas serta direktori dengan touch, mkdir, rm, dan rmdir.

Daftar isi

Topik ini membahas pembuatan dan penghapusan berkas serta direktori langsung dari terminal. Perintah yang dibahas adalah touch untuk membuat berkas kosong, mkdir untuk membuat direktori, rm untuk menghapus berkas, dan rmdir untuk menghapus direktori kosong. Setelah membacanya, operasi pembuatan dan penghapusan dapat dilakukan sambil memahami perilaku rekursif rm -r beserta risikonya, sehingga kesalahan yang sulit dipulihkan dapat dihindari.

Membuat berkas kosong dengan touch#

Perintah touch membuat berkas kosong apabila berkas dengan nama tersebut belum ada. Apabila berkasnya sudah ada, touch tidak mengosongkan isinya, melainkan hanya memperbarui waktu akses dan waktu perubahan berkas tersebut. Ukuran berkas yang baru selalu nol byte karena touch tidak menulis data apa pun. Perintah ini berguna untuk menyiapkan beberapa berkas kosong terlebih dahulu sebelum isinya diisi oleh program lain.

bash
# siapkan direktori kerja yang bersih
rm -rf /tmp/kerja-membuat-dan-menghapus
mkdir -p /tmp/kerja-membuat-dan-menghapus
cd /tmp/kerja-membuat-dan-menghapus
bash
# buat berkas kosong
touch laporan.txt
# buat tiga berkas sekaligus dalam satu perintah
touch data.csv catatan.md ringkasan.txt
# daftar isi direktori kerja
ls
text Keluaran
catatan.md
data.csv
laporan.txt
ringkasan.txt

Keluaran di atas berupa daftar nama karena ls mengurutkannya secara alfabetis, dan setiap berkasnya masih berukuran nol byte. Dua catatan waktu yang diperbarui oleh touch adalah waktu akses terakhir dan waktu perubahan isi (modification time), dan catatan itulah yang tampil pada ls -l. Perilaku penting lainnya terlihat ketika touch dijalankan atas berkas yang sudah berisi, sebagaimana diuji blok berikut.

bash
# isi salah satu berkas dengan satu baris teks
echo "baris pertama" > catatan.md
# touch atas berkas yang sudah ada tidak mengosongkannya
touch catatan.md
# isinya masih utuh
cat catatan.md
text Keluaran
baris pertama

Isi catatan.md tetap utuh karena touch tidak menyentuh data berkas, dan yang berubah hanyalah catatan waktunya. Perilaku ini berbeda dengan pengalihan keluaran seperti > yang menimpa isi lama dengan yang baru. Karena itu, touch aman dijalankan berulang kali, misalnya untuk menandai bahwa sebuah langkah sudah pernah dilakukan.

Membuat direktori dengan mkdir#

Perintah mkdir membuat direktori baru dengan nama yang diberikan. Direktori induknya harus sudah ada, sehingga mkdir gagal apabila jalur induknya belum dibuat. Opsi -p mengubah perilaku ini: seluruh induk yang belum ada ikut dibuat sekaligus, dan perintah tidak menimbulkan error apabila direktori tujuan sudah ada. Sifat semacam ini disebut idempotent, yakni memberikan hasil akhir yang sama meskipun perintahnya dijalankan berulang. Karena itu, mkdir -p menjadi pilihan yang aman di dalam skrip.

bash
# buat satu direktori kosong
mkdir arsip
# buat direktori bersarang sekaligus dengan opsi -p
mkdir -p proyek-web/css proyek-web/js
# tampilkan pohon direktori yang terbentuk
find proyek-web
text Keluaran
proyek-web
proyek-web/js
proyek-web/css

Struktur yang terbentuk terdiri atas proyek-web dengan dua subdirektori di dalamnya. Tanpa opsi -p, operasi yang sama harus ditulis tiga kali, yaitu mkdir proyek-web, mkdir proyek-web/css, dan mkdir proyek-web/js. Perintah find pada blok di atas hanya berperan menampilkan pohon yang baru dibuat.

Menghapus berkas dengan rm#

Perintah rm melepas tautan berkas dari direktorinya. Penghapusan dilakukan tanpa konfirmasi dan tanpa memindahkan berkas ke tempat sampah, sehingga berkas yang terhapus tidak dapat dikembalikan dengan cara biasa. Beberapa berkas dapat dihapus dalam satu perintah, baik dengan menyebutkan namanya satu per satu maupun dengan pola glob, yakni pola nama yang meluas menjadi daftar berkas yang cocok. Opsi -f membuat rm diam terhadap berkas yang tidak ada dan melewati konfirmasi apa pun, sehingga opsi ini hanya tepat dipakai di dalam skrip yang telah menguji jalurnya.

bash
# hapus satu berkas yang disebut namanya
rm laporan.txt
# hapus beberapa berkas dengan pola
rm *.csv *.md
# sisa isi direktori kerja
ls
text Keluaran
arsip
proyek-web
ringkasan.txt

rm pertama menghapus laporan.txt secara langsung, sedangkan rm kedua meluaskan pola *.csv dan *.md menjadi daftar berkas yang cocok, lalu menghapusnya sekaligus. Yang tersisa hanya ringkasan.txt beserta direktori yang dibuat pada bagian sebelumnya. Tidak ada satu pesan pun yang tampil karena rm memang diam ketika berhasil.

Menghapus direktori: rmdir dan rm -r#

Perintah rmdir hanya menghapus direktori yang benar-benar kosong. Batasan ini merupakan pengaman, karena direktori yang masih berisi berkas tidak mungkin terhapus secara tidak sengaja dengan satu perintah rmdir. Blok berikut menunjukkan penolakan tersebut beserta cara yang benar untuk menghapus direktori yang berisi.

bash
# taruh satu berkas di dalam arsip
echo "arsip 2025" > arsip/2025.txt
# rmdir menolak direktori yang masih berisi berkas
rmdir arsip
# hapus dulu berkasnya, lalu direktorinya
rm arsip/2025.txt
rmdir arsip
# pastikan arsip sudah tidak ada
ls
text Keluaran
rmdir: failed to remove 'arsip': Directory not empty
proyek-web
ringkasan.txt

Pesan error pada keluaran muncul karena arsip masih memuat 2025.txt, bukan karena perintahnya salah. Setelah berkasnya dihapus, rmdir berjalan tanpa keluaran apa pun, sesuai kebiasaan perintah Unix yang diam ketika berhasil. Untuk direktori dengan banyak isi, menghapus berkas satu per satu tidak praktis, sehingga rm menyediakan opsi -r (recursive) yang menghapus direktori beserta seluruh isinya.

bash
# rm -r menghapus direktori beserta seluruh isinya
rm -r proyek-web
# direktori kerja kini hanya berisi berkas
ls
text Keluaran
ringkasan.txt

Seluruh pohon proyek-web hilang dalam satu perintah. rm -r inilah yang paling sering dipakai sehari-hari, sedangkan rmdir dipilih justru karena keengganannya menghapus direktori berisi. Pola kerja yang sehat adalah memakai rmdir sebagai pilihan bawaan dan menaikkan ke rm -r hanya ketika keputusan penghapusannya sudah pasti.

Kesalahan umum#

Kesalahan pertama yang sering terjadi adalah memakai rmdir pada direktori yang masih berisi berkas, lalu menyangka direktorinya rusak. Pesan Directory not empty pada bagian sebelumnya adalah perilaku yang benar, bukan kerusakan. Perbaikannya adalah mengosongkan direktori terlebih dahulu, atau menggunakan rm -r apabila penghapusannya memang dikehendaki.

Kesalahan kedua berasal dari variabel shell yang belum terisi. Apabila skrip menjalankan rm -rf "$TARGET"/ padahal TARGET kosong, perintah yang benar-benar dieksekusi berubah menjadi rm -rf /, yaitu penghapusan atas seluruh sistem. Kebiasaan yang mencegah kejadian ini adalah menguji isi variabel sebelum dipakai, misalnya dengan test -n "$TARGET", atau menolak jalur kosong di awal fungsi.

bash Bahaya: variabel yang belum terisi
# tidak-dijalankan
# bila TARGET kosong, baris di bawah berubah menjadi rm -rf /
rm -rf "$TARGET"/

Kesalahan ketiga menyangkut nama berkas yang mengandung spasi. Perintah rm laporan final.txt dibaca shell sebagai permintaan penghapusan dua berkas, yaitu laporan dan final.txt, sehingga berkas yang salah ikut menjadi sasaran atau muncul pesan bahwa berkas itu tidak ada. Nama yang mengandung spasi harus ditulis dalam tanda kutip, misalnya rm "laporan final.txt".

Ringkasan#

  • touch membuat berkas kosong, atau memperbarui waktu berkas yang sudah ada tanpa mengosongkan isinya.
  • mkdir membuat direktori dengan syarat induknya ada, sedangkan mkdir -p membuat seluruh induknya sekaligus dan diam apabila direktorinya sudah ada.
  • rm melepas tautan berkas tanpa konfirmasi dan tanpa tempat sampah, sedangkan rmdir hanya menerima direktori yang kosong.
  • rm -r menghapus direktori beserta seluruh isinya, sehingga jalurnya wajib diperiksa sebelum perintah dieksekusi.

Referensi#