Bash — удалить все, начинающееся с, но не заканчивающееся

#bash #glob

#bash #глоб

Вопрос:

Я пытаюсь написать команду, которая удаляет все файлы / папки, начинающиеся с «test», исключая zip-файлы, которые также начинаются с test.

Пока у меня есть:

  rm -rf test*[!zip]
  

Это почти работает, но не совсем.

Если у меня есть следующие файлы:

 test
test1
test.zip
  

Затем после выполнения оставшейся команды:

 test
test.zip
  

Итак, проблема в том, что тест также должен быть удален. Я понимаю, что моя команда соответствует только тем вещам, которые имеют хотя бы один дополнительный символ, кроме «test», но не уверен, как это исправить.

Комментарии:

1. Обратите внимание, что в вашем случае [!zip] не является фиксированным шаблоном, говорящим exclude zip , он говорит exclude z , i или p . Для исключения шаблонов используйте extglob подход, указанный в ответе анубхавы

Ответ №1:

Для вашего шаблона test*[!zip] глобуса потребуется хотя бы один символ после test из-за наличия [!zip] части.

Вы можете использовать этот расширенный шаблон глобуса в bash :

 shopt -s extglob nullglob
printf '%sn' test!(*zip)
  

Или же вы можете использовать это find :

 find . -maxdepth 1 -mindepth 1 -type f -name 'test*' -not -name 'test*zip'