Я сталкивался с шаблонами с подстановками и символами подстановки, и меня это особенно интересует [!]
.
Эта конструкция похожа на
[!]
конструкцию, за исключением того, что вместо совпадения с любыми символами в скобках она будет соответствовать любому символу, если она не указана между[
и]
.
rm myfile [!192]
Вышеуказанное, я считаю, удалит все / все файлы, за исключением любых / всех файлов, которые имеют 192 в названии.
Однако меня беспокоит правильное использование этого с расширением файла и, в частности, несколькими условиями.
Каков будет правильный синтаксис в такой ситуации?
rm myfile [!.gif .csv. mp3]
или
rm myfile [!.gif !.csv !.mp3]
Меня беспокоит то, что точка может быть смещена, и поэтому любой файл с .
(который наверняка будет любым из них?) Будет подвергаться манипулированию, когда я пытаюсь вызвать манипулирование конкретными файлами.
Эта конструкция похожа на [ ]
конструкцию, за исключением того, что вместо совпадения с любыми символами в скобках она будет соответствовать любому символу, если она не указана между [
и ]
.
(цитируется по адресу http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm )
Теперь; для меня это говорит о том, что тогда единственное число !
является достаточным, и все значения после него содержатся в пределах диапазона.
источник
ls my-pattern
или,echo my-command
чтобы проверить, все ли сделано так, как вы хотите, перед запускомrm
[!]
она похожа, но не похожа[!]
^
имеет то же значение, что и!
в этом контексте, поэтому[^a]
исключаетa
точно так же, как это[!a]
делает: если первый символ после [это a! или ^ тогда любой символ, не заключенный в это, совпадает. (man bash
)rm myfile [!192]
удалитmyfile
любой файл односимвольный, а не по имени1
,9
или2
.Ответы:
Ссылаясь на
man 7 glob
:Акцент на односимвольной части здесь
[]
не может быть использован для целых строк в Bash Pattern Matching.bash
«S Скоба расширение может быть использовано для сопоставления строк, однако нет никакого способа (я знаю) , чтобы отрицать их. Напримеррасширен до
независимо от того, существуют ли эти файлы.
Как указал wchargin ,
shopt
можно использовать расширенные операторы сопоставления с образцом, одним из которых является!()
. После запускаshopt -s extglob
, напримеррасширен до
если эти файлы существуют в текущем каталоге. Для получения дополнительной информации
man bash
(раздел РАСШИРЕНИЕ / Расширение пути) и Расширение пути (глобализация) .Я всегда буду использовать то
find
, что вы пытаетесь сделать , что предлагает отрицание и многое другое, например, следующим образом:Это просто перечисляет результаты, если вы хотите удалить их, просто добавьте
-delete
опцию в конец команды. Как всегда при удалении действий: всегда сначала проверяйте внимательно .find
предлагает массу полезных опций, очень хорошо объяснилman find
.источник
find
команда является рекурсивной ( edit: как она была первоначально показана - я мог бы оставить этот комментарий для дополнительной релевантной, но несущественной информации, которую он передает). Чтобы найти файлы, находящиеся только в текущем каталоге, но не в его подкаталогах - и, таким образом, удалить эти файлы только в том случае, если-delete
добавлено действие, - вы можете добавить-maxdepth 1
сразу послеfind .
. Это привело бы его в соответствие с эффектом глобализации, поскольку глобусы не являются рекурсивными в Bash, если не включена и не используетсяglobstar
опция оболочки**
. Показанный в вопросе шар является нерекурсивным во всех оболочках.shopt -s extglob
, вы можете использоватьecho 1.!(gif|csv|mp3)
, который печатает все ,1.ext
гдеext
нетgif
,csv
илиmp3
. (См. Подраздел «Сопоставление с образцом»man bash
.)Я думаю, что вы неправильно поняли использование скобок.
[abc]
соответствует один из символовa
,b
илиc
.[!abc]
соответствует одному символу, который не являетсяa
,b
илиc
. Итак, командаудалит
myfile
и файлы1
,9
и2
потому что у вас есть пробел между myfile и скобкой. В отличие от командыудалит файлы
myfile1
,myfile9
иmyfile2
.источник
find
.Скобки
[
]
обозначают класс персонажа. Любой отдельный символ внутри них может совпадать в данной позиции. Таксоответствует трем возможным именам:
Это не соответствует
file192
, потому что это имеет дело только с единственным символом послеfile
.Мы также можем использовать диапазоны в скобках.
[0-9]
соответствует любой единственной цифре в данной позиции. Нам нужны две цифры[0-9][0-9]
. Для цифры, за которой следует заглавная буква, мы могли бы использовать[0-9][A-Z]
...!
указывает на отрицание.будет соответствовать файлам, которые имеют какой-либо один символ после,
file
кроме1
или9
или2
. Например, он будет соответствоватьfile7
иfiles
иfile%
(и многим другим), но нетfile192
, потому что в нем есть два дополнительных символа.Для вашего случая использования я предлагаю использовать
find
вместо[!]
. У него естьnot
оператор.Он также рекурсивный , что означает, что по умолчанию он входит во все подкаталоги. Вы можете ограничить его текущим каталогом
-maxdepth 1
, если вы этого хотите. Подстановочные знаки оболочки (globbing) нерекурсивны (хотя рекурсивное globbing с**
может быть включено).Предполагая, что вы не хотите избегать удаления символических ссылок, мы можем добавить
-type d
к отмененным тестам, чтобы избежать удаления любых каталогов. Спасибо Элии Каган за это предложение.Если вы видите, что вы хотите, вы можете запустить команду еще раз с
-delete
источник
[0-9a-fA-F]