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
Другие вопросы по тегам