Я очікував, що:
$ rm *(1)*
видалить усі файли, що містяться (1)
в імені. Я помилявся. Він видалив усі файли в каталозі.
Чому?
Я очікував, що:
$ rm *(1)*
видалить усі файли, що містяться (1)
в імені. Я помилявся. Він видалив усі файли в каталозі.
Чому?
Відповіді:
Від man bash
:
*(pattern-list)
Matches zero or more occurrences of the given patterns
У вас є глобальний вираз, який відповідає файлам, що починаються з нуля або більше 1
s - а це всі файли.
Один з простих способів відключити цю поведінку, яка полягає в глобалізації, - це \
уникнути дужок:
rm *\(1\)*
Інакше ви можете shopt -u extglob
відключити поведінку та shopt -s extglob
повторно активувати її:
shopt -u extglob
rm *(1)*
shopt -s extglob
Зауважте, що, як каже Стефан , extglob
його вмикають bash-completion
таким чином відключаючи, що може призвести до неправильної роботи функцій завершення.
extglob
за замовчуванням не увімкнено, але увімкнено bash_completion, якщо у вас це встановлено та увімкнено. bash
не має локальної області для варіантів, як zsh
це робиться.
bash-4.3
регресія в цьому *(1)*
розширює також приховані файли.
Це, ймовірно, пов’язано з extglob
опцією оболонки. Якщо я вимкну його, шаблон видає повідомлення про помилку:
martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('
Якщо я його ввімкну, він, здається, відповідає всім. На сторінці на сторінці розміщені документи, я думаю, що вони пов'язані:
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
Я не бачу жодної документації, яка б визначала круглі дужки без провідного символу. У будь-якому випадку ви можете обійти проблему, цитуючи паролі:
martin@dogmeat ~ % echo *\(1\)*
A(1)b
Також спочатку використовуйте echo
або ls
протестуйте свій шаблон, якщо ви не впевнені, що це працює :)
{
є дугою, (
є батьківською (або круглою дужкою).
{
= фігурна дужка, (
= кругла дужка, [
= квадратна дужка. По-американськи: {
= brace, (
= paren, [
= bracket. Трохи заплутано. Якщо вам колись потрібно перевірити, як щось називається, файл Jargon - ASCII дуже корисний.
{
- це квіткова дужка, [
є квадратною дужкою і (
є круглою дужкою або, звичайно, просто дужкою. :-)
rm
шаблон, я завжди передую йомуecho
перед тим, як видавати фактичну команду. Звичка врятувала мене не один раз (з тих пір, як 6-річний або близько того, плутаючи різницю міжDEL A: *.*
іDEL *.* A:
).