Стандарт 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. (У Вас могут быть оба одновременно.)
shopt -s extglob
echo rm foo.!(org)
Это "Фу." сопровождаемый ничего не «орг»
: https://www.gnu.org/software/bash/manual/bashref.html#pattern-matching
В bash вы также можете использовать GLOBIGNORE = "*. Org"; rm -i foo *
.
И сбросить GLOBIGNORE
по завершении.
Это не лучше, чем shopt -s extglob
, но мне легче запомнить.
Трубка может сделать?
ls * | grep -v "foo.org" | xargs -I {} echo {}
(очевидно, вы можете заменить echo на rm в последней цепочке ).
Шаблон 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 {} +