Поиск каталогов без учета регистра

echo 'string' $var >print.dat

Это ничего не отобразит, но запишет string, за которым следует значение $var(, возможно претерпевающее некоторые преобразования, поскольку оно не заключено в кавычки )в файле print.dat. Кавычки вокруг строки будут удалены.

Убедитесь, что у вас нет echoпсевдонимов. Чтобы обойти любой псевдоним или функцию оболочки с тем же именем, используйте

command echo 'string' $var >print.dat

или используйте /bin/echoвместо echo.

Вы также можете использовать printf, который обычно более портативный, чем echo:

.
printf 'string %s\n' "$var" >print.dat
0
06.12.2019, 12:57
3 ответа

Вариант -iname— это то, что вам нужно.

find /home -iname 'adm_*'

Добавьте -type dдля ограничения каталогами.

find /home -iname 'adm_*' -type d

1
28.01.2020, 02:29

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

Если вы хотите просто распечатать их, используйте -inameвместо -nameс findв вашей системе Linux:

find /home -type d -iname 'adm_*'

Чтобы использовать их для чего-то сfind:

find /home -type d -iname 'adm_*' -exec sh -c '
    for dirpath do
        # use "$dirpath" here
    done' sh {} +

Это применит сценарий оболочки строки -ко всем каталогам, соответствующим регистру шаблона без учета регистра в любом месте в или под /home.

Если вы хотите ограничить поиск только /home(, а не рекурсивно ), также вставьте -maxdepth 1после пути поиска (перед любым действием ).

У вас также есть возможность добавить их прямо в оболочку. Предполагая, что вы используете bash, просто установите параметр оболочки nocaseglob:

shopt -s nocaseglob
printf '%s\n' /home/adm_*/

При этом будут напечатаны все пути к каталогам в /home, совпадающие с регистром шаблона без учета регистра. Конечный /гарантирует, что мы всегда сопоставляем только каталоги.

Чтобы также искать внутри подкаталогов, дополнительно установите параметр globstarи используйте**:

shopt -s nocaseglob globstar
printf '%s\n' /home/**/adm_*/

Очевидно, вы можете использовать это прямо в цикле:

shopt -s nocaseglob globstar dotglob nullglob
for dirpath in /home/**/adm_*/; do
    # use "$dirpath" here
done

Параметр dotglobзаставляет шаблоны подстановки соответствовать скрытым именам (точно так же, как findсделал бы ), а nullglobобеспечивает полное удаление шаблона, если совпадений нет.

1
28.01.2020, 02:29

С реализациями find, которые не поддерживают нестандартное -inameрасширение -, вы можете использовать:

find /home -name '[aA][dD][mM]_*' -type d

В некоторых findреализациях, включая GNU find, найденный на RHEL, это не будет включать файлы, имена которых содержат последовательности байтов, которые не образуют допустимые символы в текущей локали. Делать:

LC_ALL=C find /home -name '[aA][dD][mM]_*' -type d

Будет рассмотрено, что, как и в локали C, все однобайтовые значения формируют один допустимый символ каждое. (и a, A, d, D, m, M, _являются частью переносимой кодировки, поэтому обычно их кодировка неизменна для всех локалей в системе. ).

Для стандартного эквивалента -maxdepth 1GNU вы должны сделать:

LC_ALL=C find /home/. ! -name. -prune -name '[aA][dD][mM]_*' -type d

(технически это больше похоже на -mindepth 1 -maxdepth 1или FreeBSD -depth 1 -prune, что на самом деле ближе к тому, что вам нужно (здесь глубина 0(.)что вам не нужно, в противном случае исключено только потому, что оно не соответствует этот шаблон )).

0
28.01.2020, 02:29

Теги

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