Исключите один шаблон из соответствия шарика

Стандарт ISO9660 не позволяет имена с кроме A-Z, чисел и символов нижнего подчеркивания. Неважно, который инструмент Вы используете, если он просто создаст простую файловую систему ISO9660, то он, вероятно, преобразует все имена файлов, чтобы уважать эти ограничения и возможно даже вписаться в 8,3 имен файлов.

Поддержка других символов в именах файлов, а также более длительных именах файлов и других функциях файловой системы, не найденных в ISO9660, обычно достигается при помощи расширений стандарта: в мире UNIX существует Rock Ridge. Microsoft имеет Joliet. Включение одного из тех, вероятно, даст Вам, что Вы хотите (я не уверен в Joliet, но Rock Ridge всегда работал с unicode именами файлов, даже если я не знаю наверняка, как закодированные имена).

В mkisofs, например, Вы используете -R включить расширения Rock Ridge (-r для немного отличающихся значений по умолчанию) и -J включить Joliet. Ищите подобные опции в isomaster. Можно преуспеть с Rock Ridge. Хотите ли Вы включить Joliet, или не зависит от того, планируете ли Вы прочитать изображение под Microsoft OSes. (У Вас могут быть оба одновременно.)

62
24.10.2014, 18:29
4 ответа
shopt -s extglob
echo rm foo.!(org)

Это "Фу." сопровождаемый ничего не «орг»

:

: https://www.gnu.org/software/bash/manual/bashref.html#pattern-matching

59
27.01.2020, 19:32

В bash вы также можете использовать GLOBIGNORE = "*. Org"; rm -i foo * .

И сбросить GLOBIGNORE по завершении.

Это не лучше, чем shopt -s extglob , но мне легче запомнить.

24
27.01.2020, 19:32

Трубка может сделать?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(очевидно, вы можете заменить echo на rm в последней цепочке ).

11
27.01.2020, 19:32

Шаблон foo.*[^org], который правильно написан foo.*[!org](, но bashможет использовать ^вместо !), будет соответствовать любому имени, которое начинается с foo.и заканчивается чем-то, что не является o. ], rили g. Бит [...]всегда соответствует только одному символу. Это не будет соответствовать foo.org, поскольку оно заканчивается на g, но оно также не будет соответствовать foo.logпо той же причине.

Переносимым ответом было бы использовать цикл, а затем избегать действий с файлом, который мы хотим сохранить:

for name in foo.*; do [ "$name" != foo.org ] && rm -- "$name"; done

Если вы хотите избежать удаления любого файла, соответствующего foo.*и оканчивающегося на .org(, например. foo.orgили foo.beef.orgи т. д. ), затем рассмотрите возможность использования второго сопоставления с образцом, например:

for name in foo.*; do case $name in (*.org) continue;; esac; rm -- "$name"; done

Если вместо этого использовать find, первый цикл выше будет эквивалентен

find. ! -path. -prune -name 'foo.*' ! -name foo.org -exec rm {} +

, а второй будет таким же, как

find. ! -path. -prune -name 'foo.*' ! -name '*.org' -exec rm {} +
1
24.05.2021, 21:28

Теги

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