Get last dirname/filename in a file path argument in Bash
Я пытаюсь написать хук после фиксации для SVN, который размещен на нашем сервере разработки. Моя цель - попытаться автоматически извлечь копию зафиксированного проекта в каталог, где он размещен на сервере. Однако мне нужно иметь возможность читать только последний каталог в строке каталога, переданной сценарию, чтобы оформить заказ в том же подкаталоге, где размещены наши проекты.
Например, если я сделаю SVN-коммит в проекте "example", мой скрипт получит "/usr/local/svn/repos/example" в качестве первого аргумента. Мне нужно получить только "пример" из конца строки, а затем объединить его с другой строкой, чтобы я мог оформить заказ в "/ server / root / example" и сразу же увидеть изменения.
5 ответов
basename
удаляет префикс каталога пути:
$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example
Следующий подход может быть использован для получения любого пути имени пути:
pathname=a/b/c
echo $(basename $pathname)
echo $(basename $(dirname $pathname))
echo $(basename $(dirname $(dirname $pathname)))
Выход:
c
b
a
Bash может получить последнюю часть пути без вызова внешнего basename
:
subdir="/path/to/whatever/${1##*/}"
Чтобы напечатать имя файла без использования внешних команд,
Бежать:
fileNameWithFullPath="${fileNameWithFullPath%/}";
echo "${fileNameWithFullPath##*/}" # print the file name
Эта команда должна выполняться быстрее, чем
basename
а также
dirname
.
Если файл находится в текущем каталоге, вы увидите это короткое сообщение:
cd /dev/shm
basename $(pwd) # shm
У меня уже была эта команда sed, хотя я признаю, что она не очень практична:
path="/dev/shm"
sed -r "s/^.*\/(.*)$/\1/" <<< $path # shm