Saya berharap bahwa:
$ rm *(1)*
akan menghapus semua file yang mengandung (1)
nama. Saya salah. Itu menghapus semua file di direktori.
Mengapa?
Saya berharap bahwa:
$ rm *(1)*
akan menghapus semua file yang mengandung (1)
nama. Saya salah. Itu menghapus semua file di direktori.
Mengapa?
Jawaban:
Dari man bash
:
*(pattern-list)
Matches zero or more occurrences of the given patterns
Anda memiliki ekspresi glob yang cocok dengan file yang dimulai dengan nol atau lebih 1
- yang semuanya file.
Salah satu cara sederhana untuk menonaktifkan perilaku globbing ini adalah dengan \
keluar dari tanda kurung:
rm *\(1\)*
Jika tidak, Anda dapat menggunakan shopt -u extglob
untuk menonaktifkan perilaku dan shopt -s extglob
mengaktifkannya kembali:
shopt -u extglob
rm *(1)*
shopt -s extglob
Perhatikan bahwa sebagaimana dikatakan Stephane , extglob
diaktifkan dengan bash-completion
menonaktifkannya dapat menyebabkan fungsi penyelesaian tidak berfungsi dengan benar.
extglob
tidak aktif secara default tetapi dihidupkan oleh bash_completion jika Anda telah menginstal dan mengaktifkannya. bash
tidak memiliki cakupan lokal untuk opsi seperti zsh
halnya.
bash-4.3
memiliki regresi yang *(1)*
juga memperluas file tersembunyi.
Ini mungkin terkait dengan extglob
opsi shell. Jika saya mematikannya, pola menghasilkan pesan kesalahan:
martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('
Jika saya menyalakannya, sepertinya cocok dengan semuanya. Manual mendokumentasikan pola-pola ini, saya pikir mereka terkait:
If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following
description, a pattern-list is a list of one or more patterns separated
by a |. Composite patterns may be formed using one or more of the fol‐
lowing sub-patterns:
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
Saya tidak melihat dokumentasi yang menentukan apa yang dilakukan kurung tanpa karakter utama. Bagaimanapun, Anda dapat menghindari masalah dengan mengutip parens:
martin@dogmeat ~ % echo *\(1\)*
A(1)b
Juga, gunakan echo
atau ls
untuk menguji pola Anda terlebih dahulu jika Anda tidak benar-benar yakin itu berhasil :)
{
adalah penjepit, (
adalah paren (atau braket bulat).
{
= braket keriting, (
= braket bulat, [
= braket persegi. Di Amerika: {
= brace, (
= paren, [
= braket. Agak membingungkan. Jika Anda perlu memeriksa apa yang disebut sesuatu, File Jargon - ASCII cukup membantu.
{
adalah braket bunga, [
braket persegi, dan (
braket bulat atau lebih sering hanya braket. :-)
rm
suatu pola, saya selalu mendahului denganecho
sebelum mengeluarkan perintah yang sebenarnya. Kebiasaan itu menyelamatkan saya lebih dari sekali (sejak itu, ketika berusia 6 tahun, membingungkan perbedaan antaraDEL A: *.*
danDEL *.* A:
).