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
Вариант -iname
— это то, что вам нужно.
find /home -iname 'adm_*'
Добавьте -type d
для ограничения каталогами.
find /home -iname 'adm_*' -type d
Это можно сделать двумя способами в зависимости от того, что вы хотите сделать с именами, соответствующими шаблону.
Если вы хотите просто распечатать их, используйте -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
обеспечивает полное удаление шаблона, если совпадений нет.
С реализациями 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 1
GNU вы должны сделать:
LC_ALL=C find /home/. ! -name. -prune -name '[aA][dD][mM]_*' -type d
(технически это больше похоже на -mindepth 1 -maxdepth 1
или FreeBSD -depth 1 -prune
, что на самом деле ближе к тому, что вам нужно (здесь глубина 0(.
)что вам не нужно, в противном случае исключено только потому, что оно не соответствует этот шаблон )).