Perintah rm Linux: hapus file dan direktori dengan pemeriksaan target

Perintah rm menghapus nama file dari sistem berkas tanpa memindahkannya ke tempat sampah desktop. Untuk direktori beserta isinya, gunakan -r hanya setelah memastikan seluruh target memang boleh dihapus; -f menghilangkan permintaan konfirmasi dan bukan sarana pemulihan.

Contoh menggunakan GNU Coreutils. Periksa rm --help, man rm, dan dokumentasi distribusi untuk opsi yang tersedia; -I dan opsi perlindungan panjang di bawah merupakan fitur GNU.

Apa yang dihapus oleh rm?

rm menghapus entri direktori, yaitu nama yang menghubungkan sebuah file dengan direktori. Secara bawaan, perintah ini tidak menghapus direktori. Ruang data baru dapat digunakan kembali setelah tidak ada tautan keras lain dan tidak ada proses yang masih membuka file tersebut. Menghapus nama bukan berarti menimpa seluruh data pada media penyimpanan.

Saat menelusuri direktori secara rekursif, rm menghapus tautan simbolik yang ditemuinya, bukan mengikuti tautan itu ke pohon lain. Tetap periksa jalur yang Anda berikan; jangan menambahkan garis miring pada operand tautan simbolik dengan asumsi perilakunya sama.

Sintaks dasar

rm [OPSI]... FILE...

Kutip jalur yang berisi spasi, misalnya rm -- 'laporan lama.txt'. Tanda -- mengakhiri opsi sehingga nama berawalan tanda hubung diperlakukan sebagai operand. Tanda itu tidak mengubah direktori kerja atau membatasi perluasan pola oleh shell.

Penggunaan dasar rm

Menghapus file tertentu

Latih contoh di direktori baru milik Anda, misalnya direktori hasil mktemp -d yang Anda masuki dengan cd. Siapkan hanya file latihan, misalnya touch -- old-report.txt -temporary.txt, lalu periksa namanya. Dua perintah berikut menghapus masing-masing file tersebut tanpa membuat salinan cadangan.

rm old-report.txt
rm -- -temporary.txt

Menghapus beberapa file yang cocok

Di direktori latihan, buat beberapa file seperti a.tmp dan b.tmp. Jalankan baris pertama, baca seluruh daftar, lalu jalankan baris kedua hanya jika setiap hasil memang boleh dihapus. Pola diperluas oleh shell sebelum rm menerimanya.

printf '%s\n' *.tmp
rm -- *.tmp

Pada Bash dengan pengaturan biasa, pola yang tidak cocok tetap berupa teks *.tmp sehingga rm melaporkan file tidak ditemukan. File tersembunyi seperti .cache.tmp tidak cocok dengan pola ini. Daftar pratinjau bukan daftar yang dibekukan: file dapat berubah sebelum penghapusan. Nama yang mengandung baris baru juga membuat daftar berbasis baris ambigu; untuk pemrosesan otomatis, gunakan pembatas NUL dan alat yang mendukungnya, bukan memecah keluaran ls.

Menghapus pohon direktori

Siapkan pohon latihan sendiri, misalnya mkdir -p build-cache/sub dan touch build-cache/sub/demo.tmp. Pastikan jalur absolut hasil realpath -e -- build-cache berada di direktori latihan yang dimaksud. Baca pratinjau sebelum menjalankan penghapusan.

find build-cache -maxdepth 2 -print
rm -r -- build-cache

-maxdepth 2 membatasi kedalaman tampilan find, bukan kedalaman penghapusan. Jika ada isi yang lebih dalam, hilangkan batas itu untuk pemeriksaan lengkap; rm -r tetap menelusuri seluruh pohon. Setelah berhasil, build-cache beserta isinya hilang. Untuk direktori kosong saja, rmdir yang menolak direktori berisi data memberi batas operasi yang lebih sempit.

Memeriksa penghapusan yang tidak menghasilkan keluaran

rm biasanya tidak menampilkan keluaran ketika berhasil. Dalam direktori latihan baru, contoh ini membuat dan menghapus satu file lalu memeriksa namanya. Pastikan nama tersebut bukan file milik Anda yang sudah ada.

printf 'demo\n' > disposable-demo.txt &&
rm -- disposable-demo.txt &&
test ! -e disposable-demo.txt &&
test ! -L disposable-demo.txt
printf '%s\n' "$?"

Keluaran 0 berarti seluruh rangkaian berhasil dalam direktori latihan yang dapat diakses. Pemeriksaan terakhir juga menolak nama yang masih berupa tautan simbolik putus. Status harus dibaca segera: $? selalu merujuk perintah terakhir, bukan seluruh riwayat terminal. Rangkaian ini tidak membuktikan bahwa semua salinan, tautan keras, atau data fisik telah dihapus, dan tidak menjamin pemulihan.

Opsi utama

Opsi Fungsi
-r, -R Menghapus direktori beserta seluruh isi secara rekursif.
-i Meminta konfirmasi untuk setiap item; penelusuran direktori dapat menimbulkan beberapa pertanyaan.
-I Meminta konfirmasi sekali jika operand lebih dari tiga atau penghapusan rekursif diminta.
-f Tidak meminta konfirmasi; mengabaikan operand yang tidak ada dan daftar operand kosong. Kesalahan izin tetap dapat menggagalkan penghapusan.
-d Mengizinkan penghapusan direktori kosong, tanpa menelusuri direktori berisi data.
-v Menampilkan informasi tentang entri yang diproses untuk dihapus.
--one-file-system Saat rekursi, melewati direktori pada sistem berkas berbeda dari operand asalnya.
--preserve-root[=all] Perlindungan bawaan menolak penghapusan rekursif /; =all juga menolak operand pada sistem berkas yang berbeda dari induknya.

Pada GNU, -f membatalkan pengaturan interaktif sebelumnya, sedangkan -i atau -I yang diberikan sesudahnya mengaktifkan konfirmasi kembali. Jangan menggabungkan opsi bertentangan tanpa memahami urutannya. Penolakan konfirmasi dengan -i dapat tetap menghasilkan status sukses karena item tersebut sengaja dilewati; status nol saja bukan bukti bahwa semua operand telah hilang.

Contoh praktis

Memeriksa jalur yang disimpan dalam variabel

Contoh Bash berikut hanya memeriksa dan menampilkan, tanpa menghapus. Buat direktori latihan dengan mkdir -p cleanup-lab/build-cache terlebih dahulu. realpath -e mengharuskan jalur tersedia dan menyelesaikan tautan simbolik; pola case hanya menerima target di bawah direktori induk yang sudah ditentukan.

root=$(realpath -e -- ./cleanup-lab) || exit 1
target=$(realpath -e -- ./cleanup-lab/build-cache) || exit 1
case "$target" in
  "$root"/*) printf 'target=%s\n' "$target"; find "$target" -maxdepth 2 -print ;;
  *) printf '%s\n' 'Target di luar direktori latihan' >&2; exit 1 ;;
esac

Hasil yang diharapkan adalah jalur absolut .../cleanup-lab/build-cache beserta isinya sampai kedalaman dua. Target yang sama dengan induk atau berada di luar induk ditolak. Pemeriksaan ini adalah pengamatan pada saat itu, bukan perlindungan terhadap perubahan jalur oleh proses lain; untuk otomatisasi, gunakan direktori yang Anda kendalikan, izin terbatas, dan pemeriksaan ulang sebelum operasi yang menghapus.

Menggunakan konfirmasi interaktif

Siapkan important.conf dan pohon old-release sebagai data latihan yang terpisah. Jawab pertanyaan sesuai isi yang telah diperiksa; jangan mengirim jawaban setuju secara otomatis.

rm -i important.conf
rm -Ir old-release/

Baris pertama menanyakan file tersebut. Baris kedua meminta satu persetujuan untuk seluruh operasi rekursif, bukan satu persetujuan per file. Jika ditolak, data tetap ada. Pertanyaan mengikuti bahasa lingkungan; bentuk jawaban yang diterima bergantung pada locale. Skrip tanpa operator sebaiknya menguji prasyarat, bukan menunggu jawaban interaktif.

Membatasi penelusuran pada batas sistem berkas

Contoh /srv/chroot adalah pohon sekali pakai yang sudah diverifikasi, bukan anjuran menghapus jalur tersebut pada sistem Anda. Untuk latihan, ganti dengan direktori milik Anda. Pada Linux dengan util-linux, tampilkan sistem berkas yang memuat jalur dan mount turunannya, lalu baca kolom TARGET, SOURCE, dan FSTYPE sebelum menyetujui pertanyaan rm -I.

findmnt --target /srv/chroot --submounts --output TARGET,SOURCE,FSTYPE &&
rm -Ir --one-file-system --preserve-root=all -- /srv/chroot

&& menghentikan rangkaian jika findmnt gagal, tetapi hasil yang berhasil tetap perlu ditafsirkan. Jika jalur bukan mount point, --target memilih sistem berkas yang memuatnya; tampilan turunannya dapat mencakup mount lain di luar pohon target. Periksa jalur mount yang benar-benar berada di bawah target.

--one-file-system tidak melindungi bind mount yang masih berada pada sistem berkas yang sama, dan tidak melindungi operand yang memang Anda sebutkan sebagai target utama. --preserve-root=all memberi pemeriksaan tambahan pada operand, tetapi kedua opsi tidak melindungi salah pilih direktori pada sistem berkas yang sama. Direktori yang dilewati dapat tersisa dengan status gagal; periksa diagnostik dan isi yang tertinggal sebelum mengulang.

rm dan perintah terkait

Perintah atau metode Peran utama Penggunaan yang sesuai
rm Menghapus nama file atau pohon direktori Target telah diperiksa dan tidak memerlukan pemulihan melalui tempat sampah
rmdir Menghapus direktori kosong saja Isi yang masih ada harus dipertahankan
Utilitas tempat sampah Memindahkan item ke lokasi pemulihan Alur kerja interaktif yang memerlukan pembatalan penghapusan
shred Mencoba menimpa data file Kasus khusus setelah menilai perilaku media dan sistem berkas

shred tidak menjamin penghapusan seluruh jejak pada SSD, snapshot, cadangan, atau sistem berkas yang menyimpan salinan data. Penghapusan nama dengan rm dan sanitasi media merupakan dua tujuan yang berbeda.

Hal yang perlu diperhatikan

Hindari kebiasaan memakai rm -rf

Rekursi memperluas lingkup, sedangkan pemaksaan meniadakan pertanyaan. Periksa variabel tidak kosong, jalur absolut hasil resolusi berada di bawah induk yang dimaksud, dan semua isi memang boleh dihapus. Pilih opsi minimum yang diperlukan; jangan mengandalkan perlindungan / untuk mencegah kesalahan pada direktori lain.

Jangan mengandalkan alias sebagai satu-satunya perlindungan

Alias interaktif seperti alias rm='rm -i' mungkin tidak aktif di skrip atau sistem lain. Selain itu, opsi pada pemanggilan dapat mengubah perilakunya. Gunakan pemeriksaan jalur, akun dengan izin terbatas, dan cadangan yang dapat dipulihkan.

Periksa kegagalan sebagian dan rencana pemulihan

Daftar beberapa operand tidak membentuk transaksi yang dapat dibatalkan: sebagian file mungkin sudah terhapus ketika item lain gagal. Setelah status gagal atau gangguan, periksa apa yang tersisa. -f tidak melewati izin direktori, sistem berkas hanya-baca, atau pembatasan sistem lainnya.

Pemulihan tidak dijamin dan dapat menjadi mustahil setelah ruang dipakai ulang atau penyimpanan membersihkan data. Simpan cadangan yang sudah diuji sebelum menghapus data penting; rm tidak menyediakan perintah undo.

FAQ

Apakah rm mengirim file ke tempat sampah?

Biasanya tidak. rm pada baris perintah menghapus nama tanpa melalui tempat sampah desktop.

Opsi mana yang menghapus direktori beserta isinya?

Gunakan -r setelah memastikan seluruh pohon boleh dihapus. Untuk direktori kosong, gunakan rmdir atau rm -d; keduanya menolak direktori berisi data tanpa rekursi.

Apa perbedaan antara -i dan -I?

-i meminta konfirmasi per item. Pada GNU, -I meminta sekali bila ada lebih dari tiga operand atau rekursi diminta; tiga file biasa saja tidak memicu pertanyaan itu.

Bisakah file yang sudah dihapus langsung dipulihkan?

Tidak ada jaminan. Jika terjadi kesalahan, kurangi penulisan ke media terkait dan pilih prosedur pemulihan atau pemulihan cadangan sesuai sistem berkas dan kondisi penyimpanan.

Dokumentasi resmi

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