Удалите все кроме одного (или больше) вид типа файла

Это не легко. Проблема - это, когда Вы делаете:

rm -- *.txt

комната просто видит список файлов, не globbing шаблон, который был уже расширен оболочкой.

То, что Вы могли сделать, (zsh):

alias rm='noglob rm'

Это говорит zsh, что шаблоны не должны быть расширены при вызове комнаты. Затем можно переопределить комнату как функцию, которая делает само расширение и добавляет "-i" в случае необходимости что-то как:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

Проблема с тем подходом, хотя то, что эта новая "комната" не видит различия между

rm *

и

rm '*'

Удалить названный файл *, необходимо было бы записать это:

rm [*]
20
24.11.2013, 23:21
3 ответа

extended_glob опция дает Вам собственный расширенный синтаксис шарика zsh.

setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)

Можно установить ksh_glob опция получить ksh шарики. Остерегайтесь этого в общем падеже, где отрицательный шаблон является последней вещью в слове, zsh может проанализировать круглые скобки как спецификаторы шарика (это не делает этого в ksh режиме эмуляции).

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)
22
27.01.2020, 19:44
  • 1
    Это, кажется, не работает. Когда я работаю rm -r secrets/!(directory) это продолжает просить number expected или иногда это дает мне event not found: directory –  CMCDragonkai 01.06.2014, 16:46
  • 2
    @CMCDragonkai “число, ожидаемое”, указывает, что Вы не установили ksh_glob опция. “мероприятие, не учрежденное: каталог” указывает на выполнение удара (который также понимает !(…) синтаксис, но только после shopt -s extglob). –  Gilles 'SO- stop being evil' 01.06.2014, 22:01
  • 3
    Как я мог выполнять удар, когда я был в своей оболочке zsh? ответ –  CMCDragonkai 02.06.2014, 04:09
  • 4
    Для меня, setopt ksh_glob; echo !(a|b) работы, в то время как setopt ksh_glob; echo !(a) не делает ("число, ожидаемое")... –  ThiefMaster 15.02.2015, 16:09
  • 5
    @ThiefMaster у меня была та же проблема. Действительно ли это - ошибка? –  CodeTower 11.05.2015, 13:02

Другой способ удалить файлы с find, xargs и rm:

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm
3
27.01.2020, 19:44

Можно использовать find вместо Вашей оболочки:

find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete

От man find:

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.
   -name pattern
          Base of file name (the path with the leading directories removed)
          matches shell pattern pattern. 
   -delete
          Delete  files; true if removal succeeded.  If the removal failed,
          an error message is issued.  If -delete fails, find's exit status
          will be nonzero (when  it eventually exits).  Use of -delete 
          automatically turns on the -depth option.

Если Вы не можете использовать find по любой причине вот способ сделать это с zsh (или другие оболочки). zsh быть zsh, существует, вероятно, более простой способ сделать это, но так как я - a bash парень, это - то, что я придумал:

for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done
5
27.01.2020, 19:44
  • 1
    , к сожалению, каждый раз, когда я использую, находит в моем Mac, он просто выходит из текущей zsh сессии без любого уведомления. У Вас есть та же проблема? find [Process completed] –  Dzung Nguyen 24.11.2013, 17:51
  • 2
    @nXqd видит обновленный ответ для способа сделать это без find. Я предлагаю, чтобы Вы отправили вопрос о Вашем find выйдите, хотя, которого не должно происходить. Если Вы делаете, включайте вывод type -a find. –  terdon♦ 24.11.2013, 18:02
  • 3
    Даже в ударе, существует простое решение: rm !(*.dmg), после shopt -s extglob. –  Gilles 'SO- stop being evil' 24.11.2013, 23:23
  • 4
    @terdon спасибо за Вашу отладку подсказок в оболочке. его вывод, кажется, корректен: find is a shell function find is /usr/bin/find –  Dzung Nguyen 25.11.2013, 00:26
  • 5
    @nXqd, который не корректен, это не должна быть функция оболочки, это должно только быть /usr/bin/find. Вам назвали функцию find определенный в одном из Ваших файлов конфигурации удара. Так как Вы находитесь на OSX, это, вероятно, ~/.profile. –  terdon♦ 25.11.2013, 02:30

Теги

Похожие вопросы