파일의 전체 경로를 얻는 방법?


717

전체 경로를 인쇄 할 수있는 쉬운 방법이 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

답변:


1188

readlink 사용 :

readlink -f file.txt

32
그것이 '-f'를위한 것입니다.
Filmor


5
방금 10.9.2에서 테스트되었으며 정상적으로 작동합니다. 어떤 readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils) 8.22
J0hnG4lt

10
@ J0hnG4lt : homebrew와 함께 coreutils를 설치하고 접두사가 붙지 않은 바이너리를 가리 키도록 PATH를 변경했기 때문입니다. coreutils를 설치하고 PATH 만 남겨두고 "greadlink"를 사용하면 효과가 있습니다.
Tim Smith

35
MAC : homebrew를 설치 한 brew install coreutils다음greadlink -f file.txt
Kra

217

나는 당신이 리눅스를 사용하고 있다고 가정합니다.

realpathcoreutils 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


cygwin (박하 2.7.9)과 함께 작동
Scrambo

1
realpath는 2011 년 readlink3 월
코어 유틸리티 리포지토리

2
realpath는 파일의 존재를 확인하지 않고 경로 만 확인합니다. 존재하지 않는 파일의 전체 경로를 요청하면 오류가 발생합니다.
스티로폼 비행 시간

4
realpath -e인수가 존재하지 않으면 @styrofoamfly 가 오류를 인쇄합니다.
아치 스탠턴

76

다음은 일반적으로 트릭을 수행합니다.

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

안녕하세요. 이 답변이 내 요구 사항에 가장 적합하다는 것을 알았습니다. 명령 줄 매개 변수 (예 : $ 1) 대신 로컬 변수를 사용하는 방법을 설명 할 수 있습니까
deeJ

1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1

7
@SopalajodeArrierez readlink파일이 심볼릭 링크 인 경우에는 작동하지 않기 때문에 심볼릭 링크 대신 심볼릭 링크의 대상을 보여줍니다.
qwertzguy

1
readlink심볼릭 링크가 생성되는 부모 디렉토리로 다시 이동 하기 때문에 이것을 좋아 하지만 무시합니다.
Sukhi

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### 출력 : / home / ravi / ..
Tom Hale

35

나는 이것이 더 쉬운 방법이 있다는 것을 알고 있지만 그것을 찾을 수 있다면 감히 ...

jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav

jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav

26
find $PWD -type f | grep "filename"

또는

find $PWD -type f -name "*filename*"

1
나를 위해, 맥에서, 이것은 $ pwd 대신에 find `pwd` -type file -name \*.dmp
효과적이었다

14

파일과 같은 디렉토리에있는 경우 :

ls "`pwd`/file.txt"

교체 file.txt대상 파일 이름으로.


9
당신은 또한 할 수 있습니다echo $(pwd)/file.txt
Alex

12

Windows에서 :

  • 개최 ShiftWindows 탐색기에서 파일을 클릭하고 바로 당신에게라는 옵션을 제공합니다 Copy as Path. 파일의 전체 경로가 클립 보드에 복사됩니다.

Linux에서 :

  • realpath yourfile다른 사람이 제안한대로 명령 을 사용하여 파일의 전체 경로를 가져올 수 있습니다.

4

나는 이것이 오래된 질문이라는 것을 알고 있지만 여기에 정보를 추가하기 만하면됩니다.

Linux 명령 which을 사용하여 명령 파일의 파일 경로를 찾을 수 있습니다.

$ which ls
/bin/ls

여기에는 몇 가지주의 사항이 있습니다. https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/을 참조 하십시오 .


5
이 답변은 너무 구체적이며 OP는 명령을 찾는 것이 아닙니다.
AL

4

Mac, Linux, * nix에서 작동합니다 :

이것은 현재 디렉토리에있는 모든 파일의 인용 된 CSV를 제공합니다.

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

이것의 결과는 파이썬리스트 나 유사한 데이터 구조로 쉽게 복사 될 수 있습니다.


현재
암호

예, 쉼표는 pwd의 모든 파일에 대한 전체 경로를 구분했습니다. 파일의 경우 'ls'대신 ls 'filename'을 수행하십시오.
Bhargav Srinivasan

3

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 프로젝트 이며 1 분 안에 설정할 수 있습니다.


1
일반적으로 pwdLinux 자체와 대부분의 다른 유닉스 계열 OS 환경에서 정상적으로 실행되어야합니다.
karolus

3

이 기능을 사용할 수 있습니다. 파일 이름에 상대 경로가없는 경우 현재 작업 디렉토리에있는 것으로 가정합니다.

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

2

비슷한 시나리오에서 다른 위치에서 cshell 스크립트를 시작합니다. 지정된 디렉토리에서만 실행되도록 스크립트의 올바른 절대 경로를 설정하려면 다음 코드를 사용합니다.

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

$0 스크립트가 실행 된 정확한 문자열을 저장합니다.

스크립트는 다음과 같이 시작되었다 경우 예를 들면 : $> ../../test/test.csh, $script_dir포함/home/abc/sandbox/v1/../../test


이것이 가장 쉽고 가장 관련성이 높은 투표로 선정되었습니다. 그러나 입력 ./test.csh하면 경로가 다음과 같이 끝납니다./test/.
vinyll

2

Mac OS X의 경우 운영 체제와 함께 제공된 유틸리티를 교체하고 최신 버전의 coreutils로 교체했습니다. 이를 통해 Mac의 ( readlink -f파일의 절대 경로) 및 realpath(디렉토리의 절대 경로 )와 같은 도구에 액세스 할 수 있습니다 .

브루 버전은 명령 이름 앞에 (GNU 도구 용) 'G'를 추가 - 동등한이 될 수 있도록 greadlink -f FILE하고grealpath DIRECTORY .

Homebrew를 통해 Mac OS X에 coreutils / GNU 도구를 설치하는 방법에 대한 지침은 이 StackExchange arcticle 에서 찾을 수 있습니다 .

주의 : readlink -frealpath명령은 Mac Unix 사용자가 아닌 경우 즉시 사용할 수 있습니다.


2
brew install coreutils
Kra

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

이것은 @ZeRemz의 답변 에서 무슨 일이 일어나고 있는지에 대한 설명입니다 .

  1. 이 스크립트는 상대 경로를 인수로 얻습니다. "$1"
  2. 그런 다음 dirname 을 얻습니다. 해당 경로의 부분을 (dir 또는 file을이 스크립트에 전달할 수 있음).dirname "$1"
  3. 그런 다음 우리 cd "$(dirname "$1")는이 상대 디렉토리에
  4. && pwd -P절대 경로를 얻습니다. -P옵션은 모든 심볼릭 링크를 피합니다
  5. 그런 다음 절대 경로에 기본 이름 을 추가 합니다.$(basename "$1")
  6. 마지막 단계는 우리로 echo그것을

1

이것은 나를 위해 아주 잘 작동했습니다. 파일 시스템 (필요에 따라 프로 / 콘)에 의존하지 않으므로 속도가 빠릅니다. 그리고 대부분의 * 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

이것은 순진하지만 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}

0

보통:

find `pwd` | grep <filename>

또는 현재 폴더에 대해서만 :

find `pwd` -maxdepth 1 | grep <filename>

흠 왜 싫어?
sjas

0

난 이미 주어진 해답의 많은 좋아하지만, 나는 다음과 같은 심볼릭 링크와 같은 상대 참조를 포함하여 파일의 전체 경로를 얻을 특히 스크립트 내에서,이 정말로 유용하다고 ...

dirname `readlink -e relative/path/to/file`

file루트 경로부터 전체 경로를 반환합니다 . 스크립트에서 어떤 경로를 사용하는지 알 수 있도록 스크립트에서 사용할 수 있으며, 이는 시스템의 어느 위치 에나있을 수있는 저장소 복제본에 유용합니다.

basePath=`dirname \`readlink -e $0\``

그런 다음 ${basePath}스크립트 에서 변수 를 사용하여 다른 스크립트를 직접 참조 할 수 있습니다.

도움이 되었기를 바랍니다,

데이브


0

이것을 저장 shell.rc하거나 콘솔에 넣을 수 있습니다

function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"

예:

ap somefile.txt

출력합니다

/home/user/somefile.txt

3
그러나 그러면 일반적으로 원하는 것이 아닌을 ap ../foobar.txt줄 것 /home/user/../foobar.txt입니다.
bdesham

2
또한 ap /tmp/foobar.txt줄 것이다 /home/user//tmp/foobar.txt잘못이다.
David 주어진

-1
find / -samefile file.txt -print

file.txt 와 동일한 inode 번호 를 가진 파일에 대한 모든 링크를 찾습니다

-xdev플래그를 추가하면 find장치 경계 ( "마운트 포인트")를 넘지 않아야합니다. (그러나 find같은 장치의 디렉토리에서 시작하지 않으면 아무것도 발견 되지 않을 것입니다 file.txt)

참고 수행 find아이 노드가 어쩌면 다른 이름을 사용하여 하나 개 이상의 디렉토리 항목으로 연결 될 수 있기 때문에, 하나의 파일 시스템 객체에 대해 여러 경로를보고 할 수 있습니다. 예를 들어 :

find /bin -samefile /bin/gunzip -ls

출력합니다 :

12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/uncompress
12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/gunzip

-1

이것은 파일과 폴더 모두에서 작동합니다.

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}


-1

이 작업을 수행하는 다른 Linux 유틸리티 :

fname <file>

-1

Mac OS의 경우 파인더에서 파일의 경로를 얻으려면 파일을 제어하고 하단의 "서비스"로 스크롤하십시오. "복사 경로"및 "복사 전체 경로"를 포함한 많은 선택이 가능합니다. 이 중 하나를 클릭하면 클립 보드에 경로가 표시됩니다.


-1

맥에서 아래 라인이 작동합니다. 멋진 선을 추가 할 필요가 없습니다.

> pwd filename

6
아니 그냥 명령의 이름이 제안한대로 작업 디렉토리 (파일 이름없이)를 인쇄합니다print working directory
anilbey

-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

텍스트를 클립 보드에 복사하고 터미널 창에 텍스트를 표시합니다.

:)

(다른 스택 오버플로 답변에서 일부 코드를 복사했지만 더 이상 해당 답변을 찾을 수 없습니다)


-2

내가 찾은 가장 쉬운 방법은

for i in `ls`; do echo "`pwd`/$i"; done

그것은 나를 위해 잘 작동


-2

Mac OSX에서 다음 단계를 수행하십시오.

  1. cd 대상 파일의 디렉토리에.
  2. 다음 터미널 명령 중 하나를 입력하십시오.
단말기
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. 바꾸다 file.txt 실제 파일 이름.
  2. 프레스 Enter

-3

"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명령은 바로 하나입니다.


-3

아래와 같은 함수를 만듭니다 (pwd를 사용하여 파일의 절대 경로를 에코하고 경로 끝에 파일을 추가합니다).

abspath() { echo $(pwd "$1")/"$1"; }

이제 파일 경로를 찾을 수 있습니다.

abspath myfile.ext
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.