bash: обратное (т.е. НЕ) расширение подстановочного знака оболочки - PullRequest
6 голосов
/ 22 сентября 2011

Есть ли способ обработки инверсного расширения оболочки bash v4, т.е.обрабатывать все файлы НЕ как подстановочный знак?Мне нужно rm всех файлов, которые не имеют формат 'Folder-???' в этом случае и было интересно, если есть более короткий (т.е. встроенный) способ, чем делать цикл

for file in *
do
  [[ $i =~ \Folder-...\ ]] && rm '$i'
done

.(пример не работает, кстати ...)

Просто из любопытства изучения bash ...

Ответы [ 3 ]

14 голосов
/ 22 сентября 2011
shopt -s extglob
rm -- !(Folder-???)
3 голосов
/ 21 октября 2013

Если вы в порядке с find, вы можете инвертировать предикаты find с -not.

Как и в

find -not -name 'Folder-???' -delete

(обратите внимание, что это рекурсивно совпадает среди других различий с соответствием глобуса оболочки, но я полагаю, вы достаточно хорошо знаете find)

3 голосов
/ 22 сентября 2011

@ Dimitre имеет правильный ответ для bash.Переносимое решение заключается в использовании case:

for file in *; do
  case "$file" in
    Folder-???) : ;;
    *) do stuff here ;;
  esac
done

Другое решение bash заключается в использовании оператора сопоставления с образцом внутри [[ ... ]] ( документация )

for file in *; do
  if [[ "$file" != Folder-??? ]]; then
    do stuff here
  fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...