Вы должны извлечь обе программы: dirname и basename . Программа dirname
принимает аргумент и удаляет имя программы из оставшейся части пути. То есть он даст вам имя каталога.
Программа basename
делает обратное. Учитывая имя пути, он удалит все каталоги и просто оставит имя файла:
$ dirname /one/two/three/four/five.txt
/one/two/three/four
$ basename /one/two/three/four/five.txt
five.txt
Теперь все остальное зависит от раковины. В BASH (который является оболочкой по умолчанию в Linux и что вы пометили, вы можете использовать синтаксис $ (command). Он принимает выходные данные команды и заменяет их в командной строке. Например:
$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four
В приведенном выше примере команда dirname
взяла имя каталога, заменила все в синтаксисе $()
и позволила мне установить имя моей переменной mydirectory
.
Вы можете использовать их в комбинации, чтобы получить то, что вы хотите:
$ my_full_dir=$(dirname "~/foo/bar/file.ext")
$ echo $my_full_dir
~/foo/bar
$ my sub_dir=$(basename $my_full_dir)
$ echo $sub_dir
bar
Вы также можете объединить команды basename
и dirname
вместе:
$ my_sub_dir=$(basename $(dirname "~/foo/bar/file.ext"))
$ echo $my_sub_dir
$ bar
Когда исполняется программа оболочки, она помещает каждый параметр в командной строке в переменную count. Например:
$ myprog alpha beta gamma delta
Внутри программы myprog
установлены следующие переменные:
$1 = "alpha"
$2 = "beta"
$3 = "gamma"
$4 = "delta"
Еще одна вещь с оболочкой BASH: есть специальный синтаксис фильтра для анализа переменных.
${variable#pattern}
- Левый маленький рисунок. Удаляет наименьший рисунок с левой стороны переменной
${variable##pattern}
- Левый большой рисунок. Удаляет самый большой рисунок с левой стороны переменной
${variable%pattern}
- правый маленький рисунок. Удаляет наименьший рисунок с правой стороны переменной
${variable%%pattern}
- правый большой рисунок. Удаляет максимально возможный шаблон с правой стороны переменной
Вот пример:
$ FOO="ONE|TWO|THREE|FOUR"
$ echo ${FOO##*|}
FOUR
$ echo ${FOO#*|}
TWO|THREE|FOUR
В вышеприведенных случаях шаблон был *|
. Это означает любую комбинацию букв, за которой следует |
. В первом наименьшее совпадение было ONE|
. Во втором это было ONE|TWO|THREE|
. Вы также можете использовать это для имитации команд basename
и dirname
:
$ myfile="~/foo/bar/file.ext"
$ echo ${myfile%/*} #Like `dirname`
~/foo/bar
$echo ${myfile#*/} #Like `basename`
file.txt