У меня есть несколько файлов с одним и тем же базовым именем файла. Я хотел бы удалить все, кроме одного
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Если бы мне не нужно было держать один, я знаю, что мог бы использовать rm foo.*.
TLDP демонстрирует ^отрицание соответствия. Методом проб и ошибок я смог найти
rm foo.*[^org]
делает то, что мне нужно, но я не совсем понимаю синтаксис.
Кроме того, хотя это не ограничение в моем случае использования, я думаю, что этот шаблон также игнорирует foo.oи foo.or. Как работает этот шаблон, и как будет выглядеть только игнорируемый foo.orgглобус?
Regular Expression. Вы должны быть осторожны с вашими группировками персонажей. Используя скобки, вы указали класс символов, что означает, что вы будете удалять любые файлы, которые имеют расширение с буквами o, rили gв любом порядке. Используйте скобки, чтобы создать группу и сохранить порядок символов.
foo.*[^org]будет соответствовать любому имени файла, которое начинается с foo.одного или нескольких символов после точки, где последний символ не является o, r или g. Так что будет соответствовать foo.orb, но не foo.orgили foo.orили foo.o. Ответ GlennJackman показывает, как включить расширенные функции сопоставления с образцом, чтобы отменить совпадение.
rm foo.*[^org]удаляются все файлы, последний символ которых не является ни однимo,rилиg, таким образом,foo.fooтоже не будет совпадать.