Как получить полный путь к файлу? - PullRequest
634 голосов
/ 10 марта 2011

Есть ли простой способ, которым я могу напечатать полный путь file.txt?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

<command>

dir> <command> file.txt  

должен напечатать

/nfs/an/disks/jj/home/dir/file.txt

Ответы [ 32 ]

2 голосов
/ 08 декабря 2016
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Это объяснение того, что происходит при ответе @ ZeRemz :

  1. Этот скрипт получает относительный путь в качестве аргумента "$1"
  2. Затем мы получаем dirname часть этого пути (вы можете передать dir или файл этому сценарию): dirname "$1"
  3. Затем мы cd "$(dirname "$1") в этот относительный dir
  4. && pwd -P и получите абсолютный путь для этого.Опция -P исключит все символические ссылки
  5. После этого мы добавим basename к абсолютному пути: $(basename "$1")
  6. В качестве последнего шага мы echo it
2 голосов
/ 19 декабря 2012

В аналогичном сценарии я запускаю скрипт cshell из другого места. Для установки правильного абсолютного пути скрипта, чтобы он работал только в указанном каталоге, я использую следующий код:

set script_dir = `pwd`/`dirname $0`

$0 хранит точную строку, в которой был выполнен скрипт.

Например, если скрипт был запущен так: $> ../../test/test.csh, $script_dir будет содержать /home/abc/sandbox/v1/../../test

2 голосов
/ 20 июня 2015

Для Mac OS X я заменил утилиты, поставляемые с операционной системой, и заменил их более новой версией coreutils.Это позволяет вам получать доступ к таким инструментам, как readlink -f (для абсолютного пути к файлам) и realpath (для абсолютного пути к каталогам) на вашем Mac.

Версия Homebrew добавляет «G» (для инструментов GNU) перед именем команды - так что эквивалентами становятся greadlink -f FILE и grealpath DIRECTORY.

Инструкции по установке coreutils / GNU Tools на Mac OS X через Homebrew можно найти в этой статье StackExchange .

Примечание: команды readlink -f и realpath должны работать "из коробки" для пользователей не-Mac Unix.

1 голос
/ 06 сентября 2018

Вы можете использовать эту функцию. Если имя файла задано без относительного пути, то предполагается, что оно присутствует в текущем рабочем каталоге:

abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }

Использование:

$ abspath file.txt
/I/am/in/present/dir/file.txt

Использование с относительным путем:

$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt

С пробелами в имени файла:

$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
1 голос
/ 28 декабря 2017

Это сработало очень хорошо для меня.Он не зависит от файловой системы (pro / con в зависимости от необходимости), поэтому он будет быстрым;и он должен быть переносимым для большинства * NIX.Предполагается, что переданная строка действительно относится к PWD, а не к какому-либо другому каталогу.

function abspath () {
   echo $1 | awk '\
      # Root parent directory refs to the PWD for replacement below
      /^\.\.\// { sub("^", "./") } \
      # Replace the symbolic PWD refs with the absolute PWD \
      /^\.\//   { sub("^\.", ENVIRON["PWD"])} \
      # Print absolute paths \
      /^\//   {print} \'
}
1 голос
/ 13 октября 2018

Это наивно, но я должен был сделать его совместимым с POSIX. Требуется разрешение для перехода в каталог файла.

#!/bin/sh
if [ ${#} = 0 ]; then
  echo "Error: 0 args. need 1" >&2
  exit 1
fi


if [ -d ${1} ]; then


  # Directory


  base=$( cd ${1}; echo ${PWD##*/} )
  dir=$( cd ${1}; echo ${PWD%${base}} )

  if [ ${dir} = / ]; then
    parentPath=${dir}
  else
    parentPath=${dir%/}
  fi

  if [ -z ${base} ] || [ -z ${parentPath} ]; then
    if [ -n ${1} ]; then
      fullPath=$( cd ${1}; echo ${PWD} )
    else
      echo "Error: unsupported scenario 1" >&2
      exit 1
    fi
  fi

elif [ ${1%/*} = ${1} ]; then

  if [ -f ./${1} ]; then


    # File in current directory

    base=$( echo ${1##*/} )
    parentPath=$( echo ${PWD} )

  else
    echo "Error: unsupported scenario 2" >&2
    exit 1
  fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then


  # File in directory

  base=$( echo ${1##*/} )
  parentPath=$( cd ${1%/*}; echo ${PWD} )

else
  echo "Error: not file or directory" >&2
  exit 1
fi

if [ ${parentPath} = / ]; then
  fullPath=${fullPath:-${parentPath}${base}}
fi

fullPath=${fullPath:-${parentPath}/${base}}

if [ ! -e ${fullPath} ]; then
  echo "Error: does not exist" >&2
  exit 1
fi

echo ${fullPath}
0 голосов
/ 06 августа 2015

Это будет работать как для файла, так и для папки:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
0 голосов
/ 15 июня 2018

Чтобы получить полный путь к файлу:

1) откройте свой терминал в папке, содержащей ваш файл , нажав на клавиатуре следующие клавиши:

CTRL + ALT + T

2) затем введите "pwd" (сокращение от P имя rint W orking D irectory):

your@device ~ $ pwd

вот и все, ребята!

0 голосов
/ 27 февраля 2012

Рядом с "readlink -f", другой часто используемой командой:

$find  /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile
/the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile
$

Это также дает полный путь и имя файла на консоли

Не по теме: Этот метод просто дает относительных ссылок, а не абсолютных.Команда readlink -f является правильной.

0 голосов
/ 20 февраля 2013

Вы можете сохранить это в своем "shell.rc" или просто положить в консоль

function absolute_path {echo "$ PWD / $ 1"; }

псевдоним ap = "absolute_path"

пример:

ap somefile.txt

выведет

/ дом / пользователь / somefile.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...