bash: обратное (т.е. НЕ) расширение подстановочного знака оболочки?

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

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

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

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

3 ответа

Решение
shopt -s extglob
rm -- !(Folder-???)

@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

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

Как в

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

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

Другие вопросы по тегам