bash에서 파일의 전체 경로를 얻는 방법은 무엇입니까?


22

파일의 전체 경로를 얻는 쉬운 방법을 원합니다. 나는 현재 이것을 입력 :

echo `pwd`/file.ext

그것을 단축하려고 노력하면서 bash 별칭을 만들었습니다.

alias fp='echo `pwd`/'

내가 입력하면 그러나 지금 fp file.ext, 사이에 나타나는 공간이 /하고는 file.ext.

그러한 명령이 이미 존재하며 누락되었습니다? 그렇지 않다면 bash에서 그러한 별칭이나 함수를 어떻게 만들 수 있습니까?

답변:


30

Linux 시스템에서는 readlinkGNU coreutils 프로젝트가 설치되어 있어야하며 다음을 수행 할 수 있습니다.

readlink -f file.ext

데비안 / 우분투 시스템에는 " coreutils 패키지 와 거의 같은 기능을 제공하는" realpath 유틸리티가 설치되어 있을 수 있습니다 /bin/readlink -f.


readlink -f(또는 realpath호환성을 위해 유지되는 오래된 유틸리티)은 모든 기호 링크를 추가로 확장하므로 반드시 바람직하지는 않습니다.
Gilles 'SO- 악마 그만

8
참고 : macosx에서는 작동하지 않습니다.
akira

내 Mac에서 homebrew를 사용하여 coreutils를 설치 했으며 여기에 포함되어 realpath있습니다.
Doug Harris

7

대신에 pwd명령PWD 변수를 사용하십시오 (POSIX에도 있음).

fp () {
  case "$1" in
    /*) printf '%s\n' "$1";;
    *) printf '%s\n' "$PWD/$1";;
  esac
}

Windows를 지원해야하는 경우 각 unix 도구 포트에 파일 경로 변환 규칙이 있으므로 절대 경로를 인식하는 것이 더 복잡합니다. Cygwin과 함께 cygpath유틸리티를 사용하십시오 .


아마 당신의 선택이지만이 기능은 새로운 줄을 출력하지 않을 것입니다.
cYrus

이 방법은 외부 바이너리를 호출하는 것보다 빠른 쉘 내장 기능 만 사용하는 이점이 있습니다. 이 사실을 좀 더 명확하게해야합니다.
akira

4

지금 사용하고있는 질문에 대한 답변 :

별칭은 현재 입력중인 위치에서 확장됩니다. 입력 한 내용 :

% fp<SPACE>file.ext

이것은된다

% echo `pwd`<SPACE>file.exe

이를 피하기 위해 함수를 사용할 수 있습니다.

function fp() {
    echo `pwd`/"$1"
}

평소처럼 사용할 수 있습니다.

% fp file.ext

변수 및 명령 대체에 대해 큰 따옴표가 필요합니다.echo "`pwd`/$1"
Gilles 'SO-stop

@Gilles : 어떤 상황에서?
akira

2
@akira : 확장 결과를 globbing 패턴으로 취급하고 globbing 결과를 단어로 분리하지 않으려면 항상 큰 따옴표를 사용하십시오. 여기서는 단일 파일 이름을 작성하므로 큰 따옴표가 필요합니다 ( *다른 파일을 포함하는 디렉토리에있는 파일로 함수를 시도하십시오 ).
Gilles 'SO- 악마 그만해

' '는 쉘 (내 경우에는 zsh)에 의해 붙잡고 기능에 도달하기 전에 확장됩니다. 함수의 첫 번째 paramete 이후 fp *수율 /tmp/4cc3ea0c1b34b입니다. 다른 매개 변수는 디렉토리의 다른 파일입니다. ' ' 라는 파일이있는 즉시 "*"또는 * 또는 *로 호출하여 함수가 예상대로 작동합니다.
akira

bash는 여기에서 "나쁜"것입니다. bash는 당신이 말하는 것을 산출합니다.
akira

3

당신이 사용할 수있는:

realpath file.ext

나는 그것을 가지고 있지 않습니다. 어디에서 왔습니까?
frabjous

@frabjous : 데비안 및 파생 제품에만 적용되며 요청한 패키지 또는 종속 패키지를 요청한 경우에만 설치됩니다.
Gilles 'SO- 악마 그만

아치를 사용하고 있습니다. 데비안 기반은 아니지만 어쨌든 AUR에 패키지가 있습니다. 내가 이미 readlink를 가지고 있다면 설치할 가치가 있는지 확실하지 않습니다.
frabjous

글쎄요, 그건 옵션입니다. 또는 함수를 고려할 수도 있습니다 . Gilles 의 답변을 참조하십시오 . 어쨌든 당신이 그 일을하고 싶은 실제 사용에 달려 있습니다 (호기심이 있습니다).
cYrus

@frabjous : 사용중인 시스템을 지정하지 않았지만 Aptitude 기반 패키지 관리자 (Debian, Ubuntu, Mint 등) apt-cache search realpath를 사용하는 경우 coreutils 및 일반 ol ' realpath 패키지 를 표시 할 수 있습니다 둘 다 포함합니다. 그런 다음 sudo apt-get install realpath(또는 coreutils)를 입력 하여 설치할 수 있습니다.
Michael Scheper

1

에서 /programming//a/3915420/5795941

이것은 나에게 허용되는 유일한 방법입니다. realpath 및 readlink와 같은 링크를 확장하지 않으며 내가 본 모든 고전적인 방법입니다.

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.