Эта ошибка означает, что есть проблема с источником, возможно, они внесли изменение, которое не было протестировано или не закончено. при использовании версии из SVN вы должны быть готовы к тому, что она может быть повреждена во время разработки.
Если вы используете bash (оболочка по умолчанию), опция оболочки extglob позволяет использовать расширенный синтаксис соответствия шаблону. Чтобы включить его, используйте встроенную команду shopt:
shopt -s extglob
(я включаю эту строку в мой файл .bashrc.)
Среди прочего, он предоставляет доступ к оператор !(), который соответствует любому шаблону, не входящему в паренс. Для вашей цели:
rm !(filename).gif
Дополнительная информация доступна в man bash в разделе «Соответствие шаблону».
Откройте терминал с помощью Ctrl + Alt + T и введите:
find . -type f -name "*.gif" -and -not -name "filename.gif" -exec rm -vf {} \;
Разница между -delete и -exec rm -vf {} \; заключается в том, что со вторым вариантом вы сможете увидеть, какие файлы были удалены из-за флага -v. Этого нельзя сделать с опцией -delete. (-name -delete будет печатать имена файлов, но rm с -v показывает, был ли каждый файл успешно удален.)
Имеется переменная GLOBIGNORE. Из man bash:
GLOBIGNORE
A colon-separated list of patterns defining the set of filenames
to be ignored by pathname expansion. If a filename matched by a
pathname expansion pattern also matches one of the patterns in
GLOBIGNORE, it is removed from the list of matches.
Итак, простой способ - просто установить GLOBGINORE на указанное имя файла:
$ touch {a,b,c,d}.png
$ echo *.png
a.png b.png c.png d.png
$ GLOBIGNORE=c.png
$ echo *.png
a.png b.png d.png
Итак, в вашем случае: [ ! d3]
GLOBIGNORE=filename.gif; rm *.gif
Конечно, поскольку GLOBIGNORE содержит шаблоны, вы можете использовать его всякий раз, когда хотите исключить шаблон:
$ GLOBIGNORE='[a-c].png'; echo *.png
d.png
$ touch bd.png; GLOBIGNORE='?.png'; echo *.png
bd.png
Преимущество (?!) of GLOBIGNORE заключается в том, что настройка man bash не согласована и позволяет dotglob:
The GLOBIGNORE shell variable may be used to restrict the set of file‐
names matching a pattern. If GLOBIGNORE is set, each matching filename
that also matches one of the patterns in GLOBIGNORE is removed from the
list of matches. The filenames ``.'' and ``..'' are always ignored
when GLOBIGNORE is set and not null. However, setting GLOBIGNORE to a
non-null value has the effect of enabling the dotglob shell option, so
all other filenames beginning with a ``.'' will match. To get the old
behavior of ignoring filenames beginning with a ``.'', make ``.*'' one
of the patterns in GLOBIGNORE. The dotglob option is disabled when
GLOBIGNORE is unset.
Итак, простой способ удаления всех файлы и папки в каталоге:
GLOBIGNORE=.; rm -r *
* будет соответствовать именам файлов, начинающимся с ., поскольку GLOBIGNORE включен dotglob, но он не будет соответствовать . или [ f20], поэтому вы не будете влиять на родительский каталог таким образом.