Что это за POSIX-эхо \c?

Ваш шаблон подстановки имен файлов почти правильный для обнаружения имен, которые имеют по крайней мере два символа подчеркивания, но вы заставляете имена иметь символ подчеркивания в самом конце.

Все будет в порядке, если вы просто добавите окончание *в конце паттерна:

$ find. -name '*_*_*'
./file__name
./a_file_name
./more_file_name_here

Чтобы явно не сопоставлять имена с более чем двумя символами подчеркивания:

$ find. -name '*_*_*' ! -name '*_*_*_*'
./file__name
./a_file_name

Вторая часть здесь, -name '*_*_*_*', будет соответствовать любому имени с тремя или более знаками подчеркивания, а предшествующая !сведет на нет смысл совпадения.

Обратите внимание, что выражение findбез -typeбудет соответствовать именам файлов любого типа, то есть оно может соответствовать именам каталогов, именованных каналов, сокетов, файлов устройств и т. д.

Чтобы дополнительно сопоставлять только обычные файлы, добавьте -type f, или вы можете использовать ! -type d, чтобы избежать сопоставления имен каталогов. Используйте -type lдля соответствия символическим ссылкам.

Последняя команда findможет выглядеть как:

find. -type l -name '*_*_*' ! -name '*_*_*_*' -delete

Это удалит символические ссылки, найденные в текущем каталоге или ниже, чьи имена содержат ровно два символа подчеркивания. Цели символических ссылок не будут затронуты, если только они сами не являются символическими ссылками с именами, соответствующими критериям и расположенными в текущем каталоге.

1
05.02.2020, 12:02
2 ответа

Вы нашли IEEE 1003.1 -2017, также известную как Единая спецификация Unix , опубликованную The Open Group.

Для получения дополнительной информации см. «Что такое POSIX? », «Разница между POSIX, единой спецификацией UNIX и спецификациями Open Group Base? » и все вопросы, связанные с ними. и ответы.

Здесь -nвыделено жирным шрифтом, так что его трудно не заметить. И да, \cявляется стандартным.

Изменения в поведении echoпечально известны. Вас не должно удивлять, что /bin/echo— это не то же самое, что оболочка, построенная -в echo, и что для одного требуется -e, а для другого — нет. Это даже не так просто.

Подробное объяснение см. в " Почему printf лучше, чем echo? ".

О малоизвестной -изменчивости printf, по иронии судьбы включающей ту же самую \cуправляющую последовательность, см. «Не работает форматирование Bash printf ».

5
28.04.2021, 23:24

Если вы работали на сертифицированной POSIX платформе с торговой маркой UNIX, echoпо умолчанию обрабатывал \c.

Это относится к Solaris, AIX, HP -UX и Apple.

Apple даже использует bashдля поддержки такого эхо-поведения, но вам нужен специальный параметр компиляции, чтобы сделать bashсовместимым по умолчанию. Эта опция компиляции для bashиспользуется для MacOS и Solaris. Таким образом, люди могут быть сбиты с толку, когда поймут, что bashведет себя иначе на сертифицированной POSIX платформе,

Помните, что:GNUчитает GNU не UNIX.... многие инструменты GNU несовместимы с POSIX или несовместимы с POSIX по умолчанию. Так что будьте осторожны, когда вы не на сертифицированной платформе.

BTW :Вы можете получить брендинг POSIX для небольших встроенных платформ, даже если вы не поддерживаете echo \c, но для брендинга UNIXвам необходимо поддерживать всеXSIрасширения POSIX. Linux не поддерживает большинство расширений XSI. Многие дистрибутивы Linux, например. используйте dashв качестве оболочки по умолчанию, а идентификатор dashопределенно не соответствует требованиям, например. потому что он не поддерживает многобайтовые символы.

-2
28.04.2021, 23:24

Теги

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