Или реализуйте свою находку сами ;)
myfind(){ shopt -s nullglob; [[ -f $1 ]] && pwd; for i in */ ; do ( cd $i;myfind $1 ) done }
myfind level.dat
Общее правило для имени пользователя - его длина не должна превышать 32 символа. Правильное имя пользователя зависит от вашего дистрибутива.
В Debian, shadow-utils 4.1
есть функция is_valid_name
в chkname.c
:
static bool is_valid_name (const char *name)
{
/*
* User/group names must match [a-z_][a-z0-9_-]*[$]
*/
if (('\0' == *name) ||
!((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
return false;
}
while ('\0' != *++name) {
if (!(( ('a' <= *name) && ('z' >= *name) ) ||
( ('0' <= *name) && ('9' >= *name) ) ||
('_' == *name) ||
('-' == *name) ||
( ('$' == *name) && ('\0' == *(name + 1)) )
)) {
return false;
}
}
return true;
}
И длина имени пользователя была проверена перед :
bool is_valid_user_name (const char *name)
{
/*
* User names are limited by whatever utmp can
* handle.
*/
if (strlen (name) > USER_NAME_MAX_LENGTH) {
return false;
}
return is_valid_name (name);
}
Из справочной страницы useradd (8) :
Обычно рекомендуется использовать только имена пользователей, начинающиеся со строчной буквы или символа подчеркивания, за которым следуют строчные буквы, цифры и символы подчеркивания. , или тире. Они могут заканчиваться знаком доллара. В терминах регулярных выражений: [a-z _] [a-z0-9 _-] * [$]?
В Debian единственными ограничениями являются то, что имена пользователей не должны начинаться с тире ('-') и содержать двоеточие. (':') или пробел (пробел: '', конец строки: '\ n', табуляция: '\ t' и т. д.). Обратите внимание, что использование косой черты ('/') может нарушить алгоритм по умолчанию для определения домашнего каталога пользователя.
Имена пользователей могут содержать не более 32 символов.
Итак, есть общая рекомендация. Фактические ограничения зависят от специфики вашей реализации / распространения. В системах на основе Debian, по-видимому, нет очень жестких ограничений. Фактически, я просто попробовал useradd '€'
на моем компьютере с Ubuntu, и это сработало. Конечно, это может сломать некоторые приложения, которые не ожидают таких необычных имен пользователей. Чтобы избежать таких проблем, лучше всего следовать общей рекомендации.
Извините за некробампинг этого вопроса, которому уже почти 4 --года, но он занимает довольно высокое место в результатах поиска в Интернете и требует немного большего внимания.
Более точное регулярное выражение (да, я знаю, несмотря на справочную страницу):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Надеюсь, это поможет некоторым из тех, кто ищет.
Разбить:
Он должен начинаться(^
)только со строчной буквы или подчеркивание([a-z_]
). Это занимает ровно 1 символ.
Тогда это должно быть одно из либо((... )
):
{0,31}
)из букв , цифр , подчеркиваний и/ или дефисы ([a-z0-9_-]
), ИЛИ(|
)
\$
)в конце, , а затем
Нет больше символов после этого шаблона($
).
Те, кто не знаком с регулярными выражениями, могут спросить, почему знак доллара имел обратную косую черту в 2.2, а не в 3. Это потому, что в большинстве (all? )варианты регулярных выражений, знак доллара указывает на конец строки (или строки и т. д. ). В зависимости от используемого движка его нужно будет экранировать, если он является частью фактической строки (Я не могу придумать движок регулярных выражений, который не использует обратную косую черту в качестве экранирования ).
Обратите внимание, что Debian и Ubuntu снимают некоторые ограничения, например, для имени пользователя, полностью совместимого с POSIX/shadow upstream (, и я не знаю, было ли это исправлено, но они позволяют имени пользователя начинаться с цифры – что на самом деле и вызвало эту ошибку). Если вы хотите гарантировать кросс-платформу -,Я бы рекомендовал указанное выше регулярное выражение, а не то, что проходит/не проходит проверку в Debian, Ubuntu и других.