#linux #регулярные_выражения #bash
Нужно узнать имя каталога находящегося выше текущего, потом еще выше и т.д. в BASH Например есть директория: /home/Ochen/Glupiy/Vopros Мне надо получить имя: Glupiy Потом получить имя еще более верхней DIR: Ochen И т.д. Если для текущей директории (Vopros) моя BASH команда pwd | grep -o '[^/]*$' представляла из себя квадратные колеса, то командой для директории, что выше (Glupiy) можно обзываться pwd | grep -o [^/]* | sed -e '$!{h;d;}' -e x Для директории, что еще выше я уже ничего не придумал :) Мне надо как то составить такую BASH команду, которой я бы смог дергать имя текущей, верхней, что еще выше и т.д., директории. Если нельзя составить более менее универсальную команду, то киньте в меня хотя бы командой для получения имени DIR на 2 уровня выше. Например для: /home/Ochen/Glupiy/Vopros получить имя: Ochen
Ответы
Ответ 1
Команда для получения имени DIR на N уровней выше, считая рабочую: pwd|tr / "\n"|tail -N|head -1 В Вашем примере /home/Ochen/Glupiy/Vopros : N=1 => Vopros N=2 => Glupiy и т. д. А в варианте pwd|tr / "\n"|sed 's/^$/\//'|tail -N|head -1 не потеряется корневая директория N=5 => / Поместите команду pwd|tr / "\n"|sed 's/^$/\//'|tail -"$1"|head -1 в файл, сделайте исполняемым и вызывайте с аргументом N Чтобы работало с каталогами, внутри имен которых перевод строки, применяем pwd|tr "\n" "\0"|tr / "\n"|sed 's/^$/\//'|tail -N|head -1|tr "\0" "\n"Ответ 2
можно воспользоваться программами basename и dirname: basename выделяет из переданного пути последнюю часть dirname «отрезает» от переданного пути последнюю часть, оставляя всё остальное $ cd /home/Ochen/Glupiy/Vopros $ basename $(pwd) Vopros $ dirname $(pwd) /home/Ochen/Glupiy $ basename $(dirname $(pwd)) Glupiy $ basename $(dirname $(dirname $(pwd))) OchenОтвет 3
pwd | cut -d '/' -f 3 -d - указывает, что сейчас будем указывать разделитель, '/' - экранированный разделитель, -f - какой по счёту разделитель выплёвывать. -f 3 - как раз для твоего Ochen.Ответ 4
Например, можно так: #/bin/bash # echo N-th from the tail component of PATH ($2 argument) # Usage: ./tn.sh N PATH function getn { n=$(($# - $1)) echo ${!n} } IFS=/ x=`getn $1 $2` echo x=$x Пример использования avp@avp-ubu1:hashcode$ pwd /home/avp/hashcode avp@avp-ubu1:hashcode$ ./tn.sh 1 `/bin/pwd` x=avp avp@avp-ubu1:hashcode$Ответ 5
Например, так вы можете получить массив из каталогов, чтобы обращаться к ним по индексу: IFS=/ read -r -a array <<<$(pwd) Правда, нулевой элемент будет пустым, т. к. перед начальным / каталога нет. Но это ж не проблема? Проверка: [VladD@Tigger] [00:28:47] [/tmp/x/y/z] {0,97}$> cat ./t.sh #!/bin/bash IFS=/ read -r -a array <<<$(pwd) idx=${#array[@]}-1 echo ${array[$idx]} idx=${#array[@]}-2 echo ${array[$idx]} idx=${#array[@]}-3 echo ${array[$idx]} [VladD@Tigger] [00:29:01] [/tmp/x/y/z] {0,98}$> pwd /tmp/x/y/z [VladD@Tigger] [00:29:06] [/tmp/x/y/z] {0,99}$> ./t.sh z y x
Комментариев нет:
Отправить комментарий