Saya telah menemukan pola globbing dan wildcard dan yang menarik bagi saya adalah [!]
.
Konstruk ini mirip dengan
[!]
konstruk, kecuali daripada mencocokkan karakter apa pun di dalam tanda kurung, itu akan cocok dengan karakter apa pun, asalkan tidak terdaftar antara[
dan]
.
rm myfile [!192]
Di atas saya percaya akan menghapus semua file, kecuali untuk semua file yang memiliki 192 nama.
Namun saya khawatir tentang penggunaan yang tepat dari ini dengan ekstensi file, dan dalam beberapa kondisi tertentu.
Apa yang akan menjadi sintaksis yang tepat dalam situasi seperti itu?
rm myfile [!.gif .csv. mp3]
atau
rm myfile [!.gif !.csv !.mp3]
Kekhawatiran saya adalah bahwa periode mungkin salah tempat, dan file apa pun dengan .
(yang akan menjadi salah satu dari mereka?) Kemudian akan dimanipulasi, ketika saya berusaha menyebabkan manipulasi file tertentu.
Konstruk ini mirip dengan [ ]
konstruk, kecuali daripada mencocokkan karakter apa pun di dalam tanda kurung, itu akan cocok dengan karakter apa pun, asalkan tidak terdaftar antara [
dan ]
.
(dikutip dari http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm )
Sekarang; bagi saya yang menyarankan maka singular !
sudah cukup, dan semua nilai di dalamnya terkandung dalam kisaran.
sumber
ls my-pattern
atauecho my-command
untuk memeriksa apakah globbing dilakukan seperti yang Anda inginkan, sebelum menjalankanrm
[!]
itu serupa tetapi tidak seperti[!]
^
memiliki arti yang sama persis seperti!
dalam konteks ini, karena itu[^a]
mengecualikana
persis seperti[!a]
: Jika karakter pertama yang mengikuti [adalah a! atau ^ maka setiap karakter yang tidak tertutup dicocokkan. (man bash
)rm myfile [!192]
akan menghapusmyfile
, serta setiap file tunggal-karakter tidak bernama1
,9
atau2
.Jawaban:
Mengutip
man 7 glob
:Penekanan pada bagian karakter tunggal di sini,
[]
tidak dapat digunakan untuk seluruh string dalam Bash Pattern Matching.bash
's Brace Ekspansi dapat digunakan untuk mencocokkan string, namun tidak ada cara (saya tahu) untuk meniadakan mereka. Misalnyadiperluas ke
tidak masalah apakah file-file ini ada.
Seperti yang ditunjukkan oleh wchargin
shopt
dapat digunakan untuk memungkinkan operator pencocokan pola yang diperluas, salah satunya adalah!()
. Setelah berlarishopt -s extglob
, misdiperluas ke
jika file-file itu ada di direktori saat ini. Untuk lebih banyak membaca
man bash
(bagian EXPANSION / Perluasan Pathname) dan Perluasan Pathname (globbing) .Untuk apa yang Anda coba lakukan, saya akan selalu menggunakan
find
, yang menawarkan negasi dan banyak lagi, misalnya dengan cara berikut:Ini hanya mencantumkan temuan, jika Anda ingin menghapusnya, tambahkan saja
-delete
opsi di akhir perintah. Seperti biasa dengan menghapus tindakan: Selalu periksa dengan cermat terlebih dahulu .find
menawarkan banyak opsi berguna yang dijelaskan dengan sangat baik olehman find
.sumber
find
perintah ini bersifat rekursif ( sunting: seperti yang awalnya ditampilkan - saya mungkin menyimpan komentar ini untuk info tambahan yang relevan tetapi tidak penting yang disampaikannya). Untuk menemukan file yang berada hanya di direktori saat ini tetapi tidak juga subdirektori - dan dengan demikian hanya menghapus file-file itu jika-delete
tindakan ditambahkan - Anda dapat menambahkan-maxdepth 1
segera setelahfind .
. Ini akan membuatnya sejalan dengan efek globbing, karena gumpalan tidak recursive di Bash kecualiglobstar
opsi shell dihidupkan dan**
digunakan. Glob yang ditunjukkan dalam pertanyaan ini tidak rekursif di semua shell.shopt -s extglob
, Anda dapat menggunakanecho 1.!(gif|csv|mp3)
, yang mencetak semua1.ext
di manaext
tidakgif
,csv
ataump3
. (Lihat sub-bagian "Pencocokan Pola" dariman bash
.)Saya pikir Anda salah memahami penggunaan tanda kurung.
[abc]
cocok dengan salah satu karaktera
,b
atauc
.[!abc]
cocok dengan satu karakter yang tidaka
,b
atauc
. Jadi komandanakan menghapus
myfile
dan file1
,9
dan2
karena Anda memiliki ruang antara myfile dan braket. Sebaliknya, perintahnyaakan menghapus file
myfile1
,myfile9
danmyfile2
.sumber
find
.Tanda kurung
[
]
menunjukkan kelas karakter. Setiap karakter di dalamnya dapat cocok dengan posisi yang diberikan. Begitucocok dengan tiga nama yang mungkin:
Itu tidak cocok
file192
, karena hanya berurusan dengan karakter tunggal setelahnyafile
.Kita juga bisa menggunakan rentang dalam kurung.
[0-9]
cocok dengan satu digit pada posisi yang diberikan. Untuk dua digit, kita perlu[0-9][0-9]
. Untuk digit yang diikuti dengan huruf kapital, kita bisa menggunakan[0-9][A-Z]
...!
menunjukkan negasi.akan mencocokkan file yang memiliki karakter tunggal setelah
file
kecuali1
atau9
atau2
. Misalnya itu akan cocokfile7
danfiles
danfile%
(dan banyak lainnya) tetapi tidakfile192
, karena itu memiliki dua karakter tambahan.Untuk kasus penggunaan Anda, saya sarankan menggunakan
find
bukan[!]
. Ia memilikinot
operator.Itu juga rekursif , yang berarti masuk ke semua subdirektori secara default. Anda dapat membatasi ke direktori saat ini dengan
-maxdepth 1
, jika itu yang Anda inginkan. Shell wildcard (globbing) adalah non-rekursif (meskipun globbing rekursif dengan**
dapat diaktifkan).Dengan asumsi Anda tidak ingin menghindari menghapus symlink, kami dapat menambahkan
-type d
tes yang dinegasikan untuk menghindari menghapus direktori apa pun. Terima kasih kepada Eliah Kagan untuk saran itu.Jika Anda melihat apa yang Anda inginkan, Anda dapat menjalankan perintah lagi dengan
-delete
sumber
[0-9a-fA-F]