Как получить абсолютный каталог файла в bash?
Я написал сценарий bash, который принимает входной файл в качестве аргумента и читает его.
Этот файл содержит некоторые пути (относительно его расположения) к дополнительным файлам, используемым.
Я хотел бы, чтобы скрипт перешел в папку, содержащую входной файл, для выполнения дальнейших команд.
и как мне получить папку (и только папку) из входного файла? (в linux.)
7 ответов:
чтобы получить полный путь:
readlink -f relative/path/to/fileчтобы получить каталог файла:
dirname relative/path/to/fileвы также можете объединить два:
dirname $(readlink -f relative/path/to/file)если
readlink -fнедоступно в вашей системе вы можете использовать это:function myreadlink() { ( cd $(dirname ) # or cd ${1%/*} echo $PWD/$(basename ) # or echo $PWD/${1##*/} ) }обратите внимание, что если вам нужно только перейти в каталог файла указан относительный путь, вам не нужно знать абсолютный путь, относительный путь является совершенно законным, так просто использовать:
cd $(dirname relative/path/to/file)если вы желаете вернитесь (пока скрипт работает) к исходному пути, используйте
pushdвместоcdиpopdкогда вы сделали.
взгляните на man-странице
realpath, Я использую это и как-то так:CONTAININGDIR=$(realpath ${FILEPATH%/*})
делать то, что кажется, что вы пытаетесь сделать.
Это будет работать как для файла, так и для папки:
absPath(){ if [[ -d "" ]]; then cd "" echo "$(pwd -P)" else cd "$(dirname "")" echo "$(pwd -P)/$(basename "")" fi }
$cat abs.sh #!/bin/bash echo "$(cd "$(dirname "")"; pwd -P)"некоторые пояснения:
- этот скрипт получает относительный путь в качестве аргумента
""- тогда мы получим dirname часть этого пути (вы можете передать либо dir, либо файл в этот скрипт):
dirname ""- затем мы
cd "$(dirname "");в этот относительный режpwd -Pи получаем абсолютный путь. Элемент-Pопция позволит избежать символических ссылок- в качестве заключительного шага мы
echoэтозатем запустите ваш сценарий:
abs.sh your_file.txt
попробуйте наш новый продукт библиотеки Bash realpath-lib на GitHub, что мы дали сообществу для свободного и беспрепятственного использования. Это чистый, простой и хорошо документирован, так что это здорово учиться. Вы можете сделать:
get_realpath <absolute|relative|symlink|local file path>эта функция является ядром библиотеки:
if [[ -f "" ]] then # file *must* exist if cd "$(echo "${1%/*}")" &>/dev/null then # file *may* not be local # exception is ./file.ext # try 'cd .; cd -;' *works!* local tmppwd="$PWD" cd - &>/dev/null else # file *must* be local local tmppwd="$PWD" fi else # file *cannot* exist return 1 # failure fi # reassemble realpath echo "$tmppwd"/"${1##*/}" return 0 # success }Это Bash 4+, не требует каких-либо зависимостей, а также предоставляет get_dirname, get_filename, get_stemname и validate_path.