Удалите кроме некоторых файлов/каталогов в сценарии; пересмотр потребности

У меня есть та же проблема как этот вопрос, Как удалить все файлы/папки из папки кроме немногих папок? несколько раз. Это - причина, почему я хотел записать мне сценарий для команды rmnot. Это должно взять произвольное число файлов даже с подстановочными знаками при необходимости и удалить что-либо (не рекурсивно) в том же каталоге за исключением тех файлов. Типичный пример был бы:

rmnot *tex *bib *png

Мои работы сценария, но так как я неопытен и хочу изучить это надлежащий путь, являются там более изящным способом сделать, пишут этот сценарий?

#!/bin/zsh

insert="-name . -or -name .."

for i in {1..$#}; do
    insert="$insert -or -name ${(P)i}"
done

insert="\( $insert \)"

eval "find -not $insert -exec rm {} \;"

PS: Я должен использовать ZSH из-за двойной замены ${(P)i} что-либо еще работало бы в ударе также, я думаю.

====== Оптимизированная Версия =====

 #!/bin/bash

 insert="-name . -or -name .."

 for i; do
    insert="$insert -or -name $i"
 done

 insert="\( $insert \)"

 find -maxdepth 1 -not $insert -delete
2
задан 13 April 2017 в 15:24

1 ответ

Вам даже не нужен сценарий. При использовании удара можно включить extglob и дать отрицательные шаблоны:

$ ls
foo.avi  foo.bbl  foo.bib  foo.log  foo.png  foo.tex  foo.txt  foo.wav
$ shopt -s extglob
$ rm !(*tex|*bib|*png)
$ ls
foo.bib  foo.png  foo.tex

, Как объяснено в man bash:

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol‐
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns
<час>

С zsh, эквивалент:

setopt extended_glob
rm ^(*tex|*bib|*png)
<час>

, Если Вы все еще хотите записать сценарий для этого, просто свяжите аргументы, которые Вы даете ему, но не используете подстановочные знаки (*), позволяете сценарию добавить их (благодаря @Helios для предложения более простой версии):

#!/usr/bin/env bash

## Iterate over the arguments
for i
do
    ## Add them to the pattern to be excluded
    pat+="*$i|"
done
## Activate extglob
shopt -s extglob
## Delete non-matching files
rm !(${pat})
10
ответ дан 2 December 2019 в 01:28

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

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