Поднимитесь один уровень от несуществующего пути

Оказывается что причина dmidecode и lshw не работайте то, потому что машины, на которых я тестировал их, были виртуальными машинами, по-видимому. Кажется, что виртуальные машины обычно не имеют запрошенной информации для dmidecode и lshw работать, таким образом, я не должен заполнять эти поля для виртуальных машин.

Спасибо за Вашу справку все.

3
09.09.2014, 20:22
2 ответа

Используйте расширение параметров для удаления последнего шага пути. Делайте это в цикле, пока не найдете существующий dir:

while [[ $dir && ! -d $dir ]] ; do
    dir=${dir%/*}
done
if [[ -d $dir ]] ; then
    echo $dir exists.
fi
4
27.01.2020, 21:16
chkdir() for d do ${d:+:} continue
(   cd -- "$d" && d= ||
    while cd -- "${d%"${d#*/}"}." && ! {
    [ -n "${d##*/*}" ] && break
};  do  d=${d#*/}; d=${d#"${d%%[!/]*}"}; done
    pwd -P; printf "${d:+./%s\n}\n" "$d"
);  done 2>/dev/null

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

Вот он в действии:

$ chkdir /tmp/chrome/some/nonexistent/path .. ../test *

/tmp/chrome
./some/nonexistent/path

/home/mikeserv

/home/mikeserv/test

/home/mikeserv/test
./file1

/home/mikeserv/test
./file2

/home/mikeserv/test
./file3

Если я удалю перенаправление stderr в конце и включу отладки вы можете увидеть, как это работает.

+ chkdir .. ///tmp/.//////chrome/not/
+ : continue
+ cd -- ..
+ d=
+ pwd -P
/home/mikeserv
+ printf \n

+ : continue
+ cd -- ///tmp/.//////chrome/not/
dash: 2: cd: can't cd to ///tmp/.//////chrome/not/
+ cd -- /.
+ [ -n  ]
+ d=//tmp/.//////chrome/not/
+ d=tmp/.//////chrome/not/
+ cd -- tmp/.
+ [ -n  ]
+ d=.//////chrome/not/
+ d=.//////chrome/not/
+ cd -- ./.
+ [ -n  ]
+ d=/////chrome/not/
+ d=chrome/not/
+ cd -- chrome/.
+ [ -n  ]
+ d=not/
+ d=not/
+ cd -- not/.
dash: 3: cd: can't cd to not/.
+ pwd -P
/tmp/chrome
+ printf ./%s\n\n not/
./not/
1
27.01.2020, 21:16

Теги

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