Удалите все * .mp4 и * .zip, но некоторые файлы

В одной из моих программ я вызываю команду bash для удаления всех файлов в каталоге, но некоторые:

 bash -c shopt -s extglob shopt -s nullglob rm /path/to/directory/!("file1" | "file2") 

Который для того, что я понимаю, означает «Использовать bash для этой команды, использовать расширенный шаблон, удалить все файлы, кроме тех,

Он работает хорошо, но удаляет каждый файл, кроме тех, которые указаны в команде.

Я хотел бы удалить все .mp4 и .zip в каталог, но те, которые я ввел в команду.

Я думаю, что мне придется добавить * .mp4 и * .zip где-нибудь в команде, но я понятия не имею, где.

EDIT: для ясности мне нужно «Удалить все файлы .mp4 и .zip, но сохраните их»

3 Solutions collect form web for “Удалите все * .mp4 и * .zip, но некоторые файлы”

Шаблон !("file1" | "file2") соответствует любому файлу, кроме file1␣ или ␣file2 где – пробел. То, как вы цитировали это, вводит в заблуждение: это эквивалентно !(file1 | file2) или !("file1 "|" file2 )`.

В bash нет способа комбинировать отрицательный шаблон с положительным шаблоном, чтобы сказать «все из них, кроме тех». В zsh вы можете написать

 setopt extended_glob rm /path/to/directory/*.(mp4|zip)~(keep*|1234.zip) 

для удаления this.mp4 и that.zip но не keep-this.mp4 или 1234.zip .

В bash вы можете установить переменную GLOBIGNORE чтобы исключить определенные шаблоны из всех совпадений.

 shopt -s extglob GLOBIGNORE='keep*:1234.zip' rm /path/to/directory/*.(mp4|zip) unset GLOBIGNORE 

Кроме того, вы можете использовать find , который позволяет создавать произвольно сложные булевы выражения.

 find /path/to/directory \( -name '*.mp4' -o -name '*.zip' \) ! -name 'keep*' ! -name '1234.zip' -delete 

Обратите внимание, что find recurses в подкаталоги. Если это нежелательно, добавьте -maxdepth 1 после /path/to/directory .

Если ваша find не понимает -maxdepth (это обычная, но не стандартная), вместо этого используйте -type d -prune -o . Если ваша find не понимает -delete (такое же замечание), вместо этого используйте -exec rm {} + .

Существует несколько способов:

  • Использовать find (портативный, поскольку он не нуждается в конкретной оболочке [bash])
  найти .  -maxdepth 1!  -name "exclude" -delete 

или если у вас несколько шаблонов:

  найти .  -maxdepth 1!  \ (-name "exclude" -o -name "exclude2" \) -exec rm -f {} \ + 
  • Используйте переменную GLOBIGNORE (только для bash)
  export GLOBIGNORE = исключить: exclude1: mask * 

Это исключает упомянутые файлы и маски из глобуса. После этого вы можете указать rm your_pattern

Вы можете попробовать это раньше с помощью ls

Я бы нашел. Однако ваша проблема – это пробелы.

rm /path/to/directory/!("file1" | "file2")

такая же, как rm "/path/to/directory/!(file1" "|" "file2)"

не rm "/path/to/directory/!(file1|file2)"

ознакомьтесь с правилами цитирования оболочки.

  • Почему rm -r такое же, как rm -R?
  • Необходимо удалить каталог с именем '~', созданным случайно
  • Удаление файлов, за исключением того, что имя содержит подстроку
  • rm при удалении невоспроизводимых файлов
  • Почему rm удаляет файлы только для чтения?
  • Как разрешить пользователю A удалить файл B от имени B?
  • Я удалил / bin / rm. Как его восстановить?
  • Поведение rm - как предотвратить удаление содержимого установленных точек
  • Могу ли я использовать `rm` только при использовании globbing? (либо в bash, либо в zsh, либо в обоих)
  • Почему OS X не позволяет мне переименовать файл?
  • Странный вход в мой домашний каталог
  • Interesting Posts

    Как напечатать дефисы, если переменная пуста?

    Совместимы ли ключи от Dropbear и OpenSSH?

    Как просмотреть обобщенное использование памяти группами команд (вместо процессов)

    pacman – файл, принадлежащий двум пакетам

    Curl not found (Glype)

    Как я могу изменить первую строку большого файла gzip без распаковки всего этого?

    Замените строку в файле и перезапишите файл

    Переименование файлов в префикс и средняя часть имени файла

    Как определить ошибку в определенном файле при проверке контрольной суммы (какой файл имеет проблему при проверке) в сценарии оболочки

    Используя цикл «for», запустите сценарий для всех файлов в каталоге

    Conky: round $ {top cpu 1}

    ksh – карта Ctrl-D для выхода из оболочки

    Почему общие свопы и ошибки / исправления страниц пуст в ps?

    скрипт bash, вызывающий другой скрипт, вызывает отказ в файле журнала

    Добавление репозиториев с помощью «./»

    Linux и Unix - лучшая ОС в мире.