it-swarm.com.ru

Как получить полный путь к файлу?

Есть ли простой способ распечатать полный путь 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
619
Jean

Используйте readlink :

readlink -f file.txt
1006
filmor

Я полагаю, вы используете Linux.

Я нашел утилиту под названием realpath в coreutils 8.15.

realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

Согласно комментариям @ styrofoam-fly и @ Arch-standton, только realpath не проверяет существование файла, для решения этой проблемы добавьте аргумент e: realpath -e file

162
lllllllllllll

Следующее обычно делает трюк:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
71
ZeRemz

Я знаю есть более простой способ, но черт возьми, если я смогу это найти ...

[email protected]:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav

[email protected]:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
29
jcomeau_ictx
find $PWD -type f | grep "filename"

или же

find $PWD -type f -name "*filename*"
19
Anshul Gupta

Если вы находитесь в том же каталоге, что и файл:

ls "`pwd`/file.txt"

Замените file.txt вашим целевым именем файла.

11
Steven

В окнах вы можете: -

  • Удерживайте клавишу shift и щелкните правой кнопкой мыши по файлу, который дает вам опцию с именем "Copy as Path"

    Это скопирует полный путь к файлу в буфер обмена.

В Linux вы можете использовать команду: -

  • realpath yourfile, чтобы получить полный путь к файлу, как предлагают многие.
10
Natesh bhat

Я знаю, что это старый вопрос сейчас, но просто добавить к информации здесь:

Команду Linux which можно использовать для поиска пути к файлу командного файла, т.е.

$ which ls
/bin/ls

Есть несколько предостережений к этому; пожалуйста, смотрите https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .

5
Lord Cat

Вы можете использовать скрипт fpn (полный путь) :

% pwd
/Users/adamatan/bins/scripts/fpn

% ls
LICENSE   README.md fpn.py

% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py

fpn не является стандартным пакетом Linux, но это бесплатный и открытый проект github и вы можете настроить его через минуту .

3
Adam Matan

Работает на Mac, Linux, * nix:

Это даст вам CSV всех файлов в текущем каталоге:

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

Вывод этого может быть легко скопирован в список python или любую подобную структуру данных.

3
Bhargav Srinivasan

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

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

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

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

2
JacobWuzHere
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

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

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

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

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

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

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

2
Ackq

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

#!/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}
1
Andrew Miller

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

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

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

пример:

ap somefile.txt

будет выводить

/home/user/somefile.txt

1
Roman Rhrn Nesterov

Это сработало очень хорошо для меня. Он не зависит от файловой системы (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
Russell Speight

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

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
Ramu

В Mac указанном ниже строке работает. Не нужно добавлять какие-либо необычные линии.

> pwd filename
0
Sanjeet kumar