Попробуйте:
#! /bin/bash
export maxlen=0
findmaxr()
{
if [ $# -eq 0 ] ; then
echo "Please pass arguments. Usage: findmax dir"
exit 1
fi
if [ ! -d "$1" ]; then
echo "No such directory exist."
exit 2
fi
for file in "$1"/*
do
if [ -d "$file" ] ; then
findmaxr "$file" # Recursively call the method for subdirectories
else
f=${file##*/}
cur=${#f}
if [ $maxlen -lt $cur ] ; then
maxlen=$cur
fi
fi
done
}
findmaxr "$PWD"
echo "The file with the longest name has [$maxlen] characters."
Не делайте этого:
for file in $(/bin/ls $1)
Даже если нет файла имя содержит пробелы, синтаксический анализ ls
по-прежнему ненадежен.
Напротив, это будет работать надежно:
for file in "$1"/*
Кроме того, эта форма сохранит имена родительских каталогов, которые вам нужно перейти в подкаталоги. Например, используя структуру каталогов в приведенном ниже примере, вывод ls
показывает только голые имена файлов для каталога d 1
:
$ ls 'd 1'
12345 d 2
Напротив, вывод 'd 1' / *
включает имена родительского каталога в вывод:
$ echo 'd 1'/*
d 1/12345 d 1/d 2
Именно сохраняя имена родительских каталогов, мы заставляем рекурсию работать.
Поскольку файл
теперь содержит полный путь, нам нужно удалить имена каталогов, прежде чем мы определим его длину.Это делается путем удаления префикса:
f=${file##*/}
Рассмотрим эту файловую структуру:
$ find .
.
./d 1
./d 1/12345
./d 1/d 2
./d 1/d 2/1234567
./d 1/d 2/d 3
./d 1/d 2/d 3/123456789
./script
Теперь давайте запустим наш скрипт:
$ bash script
The file with the longest name has [9] characters.
Программа с именем path_helper
по умолчанию запускается из различных /etc/*
rc-файлов оболочки.
$ grep path_helper /etc/* 2>/dev/null
/etc/csh.login:#if ( -x /usr/libexec/path_helper ) then
/etc/csh.login:# eval `/usr/libexec/path_helper -c`
/etc/profile:#if [ -x /usr/libexec/path_helper ]; then
/etc/profile:# eval `/usr/libexec/path_helper -s`
/etc/zprofile:#if [ -x /usr/libexec/path_helper ]; then
/etc/zprofile:# eval `/usr/libexec/path_helper -s`
$
Это, очевидно, не значение по умолчанию; Я отключил path_helper
и управляю PATH
в своих собственных файлах rc.
Когда вы входите в свой компьютер, loginwindow.app настраивает базовую среду, которая включает $HOME
, $SHELL
, $TMPDIR
, $LOGNAME
, $USER
и $PATH
.Среда также может быть изменена запускающими демонами или агентами. Или расширив переменную PATH в launchd
. Обычно переменная PATH устанавливается равной жестко запрограммированной переменной PATH в ядре.
sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin
Когда вы запускаете эмулятор терминала, по умолчанию он вызывает login
-login -pf <yourname>
, который устанавливает только те переменные среды, которые еще не установлены (, см.man login
).
Затем ваша оболочка-$SHELL
читает соответствующий файл в /etc
, который вызывает path_helper
. path_helper
берет уже установленную переменную PATH, считывает /etc/paths
, удаляет дубликаты в текущей переменной PATH и упорядочивает переменную PATH, как установлено в /etc/paths
, затем считывает файлы в пределах /etc/paths.d
, добавляет их в переменную PATH, а затем добавляет любые пути, которые были в исходном PATH, которые еще не были добавлены..
Наконец, ваш $SHELL считывает соответствующий rc-файл для оболочки входа в систему в вашем домашнем каталоге.