답변:
readlink 사용 :
readlink -f file.txt
brew install coreutils
다음greadlink -f file.txt
나는 당신이 리눅스를 사용하고 있다고 가정합니다.
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
realpath
는 2011 년 readlink
3 월
realpath -e
인수가 존재하지 않으면 @styrofoamfly 가 오류를 인쇄합니다.
다음은 일반적으로 트릭을 수행합니다.
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
파일이 심볼릭 링크 인 경우에는 작동하지 않기 때문에 심볼릭 링크 대신 심볼릭 링크의 대상을 보여줍니다.
readlink
심볼릭 링크가 생성되는 부모 디렉토리로 다시 이동 하기 때문에 이것을 좋아 하지만 무시합니다.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### 출력 : / home / ravi / ..
나는 이것이 더 쉬운 방법이 있다는 것을 알고 있지만 그것을 찾을 수 있다면 감히 ...
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
나는 이것이 오래된 질문이라는 것을 알고 있지만 여기에 정보를 추가하기 만하면됩니다.
Linux 명령 which
을 사용하여 명령 파일의 파일 경로를 찾을 수 있습니다.
$ which ls
/bin/ls
여기에는 몇 가지주의 사항이 있습니다. https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/을 참조 하십시오 .
Mac, Linux, * nix에서 작동합니다 :
이것은 현재 디렉토리에있는 모든 파일의 인용 된 CSV를 제공합니다.
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
이것의 결과는 파이썬리스트 나 유사한 데이터 구조로 쉽게 복사 될 수 있습니다.
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 분 안에 설정할 수 있습니다.
pwd
Linux 자체와 대부분의 다른 유닉스 계열 OS 환경에서 정상적으로 실행되어야합니다.
이 기능을 사용할 수 있습니다. 파일 이름에 상대 경로가없는 경우 현재 작업 디렉토리에있는 것으로 가정합니다.
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
비슷한 시나리오에서 다른 위치에서 cshell 스크립트를 시작합니다. 지정된 디렉토리에서만 실행되도록 스크립트의 올바른 절대 경로를 설정하려면 다음 코드를 사용합니다.
set script_dir = `pwd`/`dirname $0`
$0
스크립트가 실행 된 정확한 문자열을 저장합니다.
스크립트는 다음과 같이 시작되었다 경우 예를 들면 : $> ../../test/test.csh
,
$script_dir
포함/home/abc/sandbox/v1/../../test
./test.csh
하면 경로가 다음과 같이 끝납니다./test/.
Mac OS X의 경우 운영 체제와 함께 제공된 유틸리티를 교체하고 최신 버전의 coreutils로 교체했습니다. 이를 통해 Mac의 ( readlink -f
파일의 절대 경로) 및 realpath
(디렉토리의 절대 경로 )와 같은 도구에 액세스 할 수 있습니다 .
브루 버전은 명령 이름 앞에 (GNU 도구 용) 'G'를 추가 - 동등한이 될 수 있도록 greadlink -f FILE
하고grealpath DIRECTORY
.
Homebrew를 통해 Mac OS X에 coreutils / GNU 도구를 설치하는 방법에 대한 지침은 이 StackExchange arcticle 에서 찾을 수 있습니다 .
주의 : readlink -f
및 realpath
명령은 Mac Unix 사용자가 아닌 경우 즉시 사용할 수 있습니다.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
이것은 @ZeRemz의 답변 에서 무슨 일이 일어나고 있는지에 대한 설명입니다 .
"$1"
dirname "$1"
cd "$(dirname "$1")
는이 상대 디렉토리에&& pwd -P
절대 경로를 얻습니다. -P
옵션은 모든 심볼릭 링크를 피합니다$(basename "$1")
echo
그것을이것은 나를 위해 아주 잘 작동했습니다. 파일 시스템 (필요에 따라 프로 / 콘)에 의존하지 않으므로 속도가 빠릅니다. 그리고 대부분의 * 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} \'
}
이것은 순진하지만 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}
난 이미 주어진 해답의 많은 좋아하지만, 나는 다음과 같은 심볼릭 링크와 같은 상대 참조를 포함하여 파일의 전체 경로를 얻을 특히 스크립트 내에서,이 정말로 유용하다고 .
과..
dirname `readlink -e relative/path/to/file`
file
루트 경로부터 전체 경로를 반환합니다 . 스크립트에서 어떤 경로를 사용하는지 알 수 있도록 스크립트에서 사용할 수 있으며, 이는 시스템의 어느 위치 에나있을 수있는 저장소 복제본에 유용합니다.
basePath=`dirname \`readlink -e $0\``
그런 다음 ${basePath}
스크립트 에서 변수 를 사용하여 다른 스크립트를 직접 참조 할 수 있습니다.
도움이 되었기를 바랍니다,
데이브
이것을 저장 shell.rc
하거나 콘솔에 넣을 수 있습니다
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
예:
ap somefile.txt
출력합니다
/home/user/somefile.txt
ap ../foobar.txt
줄 것 /home/user/../foobar.txt
입니다.
ap /tmp/foobar.txt
줄 것이다 /home/user//tmp/foobar.txt
잘못이다.
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
Mac OSX에서 다음 단계를 수행하십시오.
cd
대상 파일의 디렉토리에.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
실제 파일 이름.