Bisa gak sih ngapus semua file di dalam direktori ini tapi file yang ini gak usah?
Kalian pasti pernah mengalami situasi di mana kalian ingin menghapus semua file dalam sebuah direktori, tetapi ingin mengecualikan satu file di dalamnya. Untuk mencapai hal tersebut dengan file manager mungkin bukanlah hal yang sulit. Namun, bagaimana jika kita ingin melakukannya tanpa file manager? Hanya dengan perintah rm di terminal. Apakah itu mungkin? Tentu saja mungkin, dengan menggunakan extended glob di Bash.
Familiar kah kalian dengan extended glob di Bash? Ini adalah opsi bawaan di Bash yang memperluas kemampuan pencocokan glob. Dengan mengaktifkan opsi ini, kalian dapat mengecualikan file atau direktori tertentu dalam operasi file.
Buat yang belum tau apasih glob itu? Glob dalam Bash adalah mekanisme yang digunakan untuk mencocokkan nama file atau direktori menggunakan pola tertentu. Pola ini biasanya melibatkan karakter wildcard seperti * (mewakili nol atau lebih karakter) dan ? (mewakili satu karakter). Dengan glob, pengguna dapat dengan mudah memilih file atau direktori yang sesuai dengan kriteria tertentu tanpa harus menyebutkan nama lengkapnya.
Tetapi opsi extended glob ini biasanya dalam keadaan nonaktif. Untuk mengeceknya bisa dengan menjalankan perintah di bawah
$ shopt extglob
Jika belum aktif, maka aktifkan dengan perintah
$ shopt -s extglob
Catatan penting:
Pengaktifan extended glob di atas bersifat sementara dan hanya berlaku untuk sesi terminal yang menjalankannya. Agar tetap aktif, kalian dapat menambahkan perintah di atas ke dalam file .bashrc.
Simulasi
Sebagai contoh, dalam satu direktori saya memiliki 5 buah file dan saya ingin menghapus semua file, kecuali file ke 5. Kita dapat menggunakan sintaks globing !(pattern-list) untuk menyelesaikan permasalahan tersebut.
$ ls
file1 file2 file3 file4 file5
$ rm -v !(file5)
removed 'file1'
removed 'file2'
removed 'file3'
removed 'file4'
$ ls
file5
Sebagai contoh lain, dalam satu direktori saya memiliki beberapa file dengan extensi yang berbeda-beda. Saya ingin memindahkan semua file di dalam direktori tersebut kecuali file dengan extensi .txt ke direktori ~/Documents.
$ ls
some_file.txt notes.txt certificate.pdf script.sh image.jpg
$ mv -v !(*.txt) ~/Documents/
renamed 'certificate.pdf' -> '~/Documents/certificate.pdf'
renamed 'script.sh' -> '~/Documents/script.sh'
renamed 'image.jpg' -> '~/Documents/image.jpg'
$ ls
some_file.txt notes.txt
