У меня есть та же проблема как этот вопрос, Как удалить все файлы/папки из папки кроме немногих папок? несколько раз. Это - причина, почему я хотел записать мне сценарий для команды 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
Вам даже не нужен сценарий. При использовании удара можно включить 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})