파일의 절대 경로를 인쇄하는 bash / fish 명령


448

질문 : 공급하는 파일의 절대 경로를 인쇄하는 간단한 sh / bash / zsh / fish / ... 명령이 있습니까?

사용 사례 : 나는 디렉토리에 /a/b있고 c다른 프로그램에 쉽게 붙여 넣을 수 있도록 명령 줄에 파일의 전체 경로를 인쇄하고 싶습니다 /a/b/c. 간단하지만 아직이 작은 프로그램은 긴 경로를 처리 할 때 5 초 정도 절약 할 수 있습니다. 결국 추가됩니다. 이를 위해 표준 유틸리티를 찾을 수 없다는 사실에 놀랐습니다.

다음은 샘플 구현, abspath.py입니다.

#!/usr/bin/python
# Author: Diggory Hardy <diggory.hardy@gmail.com>
# Licence: public domain
# Purpose: print the absolute path of all input paths

import sys
import os.path
if len(sys.argv)>1:
    for i in range(1,len(sys.argv)):
        print os.path.abspath( sys.argv[i] )
    sys.exit(0)
else:
    print >> sys.stderr, "Usage: ",sys.argv[0]," PATH."
    sys.exit(1)

@DennisWilliamson의 대답 (-m 옵션 사용)은 (일반적으로) 더 이식성이 있고 존재하지 않는 파일로 작업하는 것보다 우수하다고 주장합니다.
TTT

또는 Flimm의 답변; 둘 다 좋은 해결책입니다. Bannier는 그러나 원래의 질문에 가장 잘 대답 합니다.
dhardy

3
OSX 사용자 : 이 답변보기
Ian

답변:


562

시도하십시오 realpath.

$ realpath example.txt
/home/username/example.txt

133
+1, 아주 좋은 프로그램. 그러나이 명령은 쉘 명령이 아닌 외부 명령이므로 기본적으로 모든 시스템에 존재하지 않을 수 있습니다. 즉, 설치해야 할 수도 있습니다. 데비안에서는 이름이 같은 별도의 패키지에 있습니다.
로마 Cheplyaka

5
나는 내 길에 추가 realpath: 구성된 github.com/westonruter/misc-cli-tools/blob/master/realpath
웨스턴 Ruter

1
@Flimm : 상대 경로가 주어지면 여전히 유효한 경로를 제공합니다. 파일 존재에 대해 알고 싶다면 테스트와 같은 다른 도구를 사용하십시오.
Benjamin Bannier

14
@Dalin : coreutils를 설치하십시오. 바이너리 이름은 grealpath입니다.
Toni Penya-Alba

5
이 도구는 GNU coreutils 8.15 (2012)에서 도입되었으므로 매우 새롭습니다.
marbu

319

다음 readlink은 심볼릭 링크를 해결할 것입니다.

readlink -e /foo/bar/baz

50
존재하지 않는 파일의 절대 경로를 볼 수 있도록 '-e'대신 '-f'를 사용하고 싶습니다.
hluk

5
이것은 나에게 가장 단순한 것처럼 보이고 휴대용입니다. readlink는 gnu coreutils의 포트이므로 일부 임베디드 배포판을 제외한 거의 모든 Linux 배포판에 설치됩니다.
catphive

14
-m가장 적합한 옵션 인 것 같습니다 .
Matt Joiner

1
@Dalin : /usr/bin/readlink매버릭스에서. 아니면 OS X에서 해당 옵션을 찾을 수 없다는 의미입니까? 그것은 스턴트 된 BSD 버전 인 것 같습니다 ... : p
iconoclast

14
@iconoclast 이러한 옵션은 OSX에서 사용할 수 없으며 BSD readlink맨 페이지 : only the target of the symbolic link is printed. If the given argument is not a symbolic link, readlink will print nothing and exit with an error에 따라 OSX에서이 목적으로 readlink가 작동하지 않습니다.
SnoringFrog

257
#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"

8
모든 것을 인용하는 것을 잊지 마십시오. 이유를 이해하지 못하면 파일에서 프로그램을 시도하십시오 a b(a와 b 사이에 두 개의 공백 이 있으면 SO 중 하나를 먹습니다).
로마 Cheplyaka

1
또한 "/"에서 이것을 시도하십시오. "///"로 바뀝니다
George

35
당신이 realpath 작성하고 readlink를하기 때문에 실행 파일을 컴파일 할 필요가 없습니다, 지금까지 유일한 POSIX 솔루션은하지 POSIX 있습니다
치로 틸리郝海东冠状病六四事件法轮功

25
예전 에는 OS X function realpath { echo $(cd $(dirname $1); pwd)/$(basename $1); }에서 realpath명령 (현재 허용되는 답변) 을 만들었습니다. 감사합니다!
James Bedford

1
이 방법을 사용하여 스크립트의 로그 파일 이름을 정의했습니다.LOG=$(echo $(cd $(dirname $0); pwd)/$(basename $0 .sh).log)
DrStrangepork

85

잊어 readlinkrealpath이는 또는 시스템에 설치 될 수도 있고 그렇지 않을 수도있다.

의 dogbane의 대답을 확장 하면 함수로 표현됩니다.

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}

그런 다음 다음과 같이 사용할 수 있습니다.

myabsfile=$(get_abs_filename "../../foo/bar/file.txt")

어떻게 그리고 왜 작동합니까?

이 솔루션은 Bash 내장 pwd명령이 인수없이 호출 될 때 현재 디렉토리의 절대 경로를 인쇄 한다는 사실을 이용합니다 .

이 솔루션을 왜 좋아합니까?

그것은 휴대용이고 어느 쪽도 필요로하지 않는다 readlink또는 realpath종종 기본에 존재하지 않는이 주어진 리눅스 / 유닉스 배포판의 설치합니다.

dir이 없으면 어떻게됩니까?

위에서 주어진 것처럼 주어진 디렉토리 경로가 존재하지 않으면 함수는 실패하고 stderr에 인쇄합니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 해당 상황을 처리하기 위해 기능을 확장 할 수 있습니다.

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  if [ -d "$(dirname "$1")" ]; then
    echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
  fi
}

이제 상위 디렉토리가 존재하지 않으면 빈 문자열을 리턴합니다.

후행 '..'또는 '.'를 어떻게 처리합니까? 입력?

이 경우에는 절대 경로가 있지만 최소 경로는 아닙니다. 다음과 같이 보일 것입니다 :

/Users/bob/Documents/..

'..'을 해결하려면 다음과 같이 스크립트를 작성해야합니다.

get_abs_filename() {
  # $1 : relative filename
  filename=$1
  parentdir=$(dirname "${filename}")

  if [ -d "${filename}" ]; then
      echo "$(cd "${filename}" && pwd)"
  elif [ -d "${parentdir}" ]; then
    echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
  fi
}

좋은 기능이지만 분명히 질문을 이해하지 못했습니다. 스크립트가 아닌 대화식으로 사용할 것을 원했습니다.
dhardy

3
realpathcoreutils 패키지에서 제공 하는 추가하고 싶습니다 . 여기에는 who, touch또는 과 같은 도구가 포함되어 있습니다 cat. 꽤 일반적인 GNU 도구 세트이기 때문에 거의 모든 리눅스 기반 컴퓨터에 설치되어 있는지 확인할 수 있습니다. 그렇지만 두 가지 문제가 있습니다 .i) 기본 설치에서 놓칠 수 있습니다. 비 GNU 유닉스 시스템 (OpenBSD와 같은) ii)이 도구는 버전 8.15에서 도입되었으므로 (2012 년부터 새로워졌습니다) RHEL 6과 같이 장기적으로 안정적인 시스템에서는 놓칠 수 없습니다.
marbu

1
글쎄, Continuum Analytics ( Anaconda Python 배포판 제조업체 ) 가이 답변을 좋아 한 것 같습니다. conda 도구에 의해 생성 된 가상 환경을 활성화하는 데 사용되는 "activate"스크립트 에 참조가 여기에 다시 연결되어 있습니다 . 그래서… 좋은 것!
wjv

1
이것은 디렉토리에 대해서만 작동하며 (다른 것이 없기 때문에) ".."및 "."에 대처할 수 없습니다. 모든 것을 처리 해야하는 내 대답을보십시오 : stackoverflow.com/a/23002317/2709
Alexander Klimetschek

3
@marbu realpath는 Ubuntu 14.04 또는 Debian Wheezy에 없습니다. 시간이 지남에 따라 다소 표준이 될 수 있지만 확실히 그렇지는 않습니다. 또한 OP는 리눅스 나 GNU에 대해 아무 말도하지 않았다. 배쉬가 그것보다 더 널리 사용됩니다.
mc0e

77
$ readlink -m FILE
/path/to/FILE

파일이 존재하지 않더라도 작동하기 때문에 readlink -e FILE또는 보다 좋습니다 realpath.


좋은. 존재하지만 심볼릭 링크가 아닌 파일 / 디렉토리에서도 작동합니다.
quietmint

OS X 10.9 (Mavericks)에서 사용 가능한 readlink가 있으므로 이것이 가장 좋은 대답입니다.
Kenneth Hoste

6
@KennethHoste : -mMavericks 에서는 옵션을 사용할 수 없습니다.
iconoclast

2
DEFAULT OSX 설치가 아닙니다.
Fran Marzoa

realpath가 존재하지 않기 때문에 리눅스 (CentOS)에서 작동합니다.
jimh

66

절대 경로 변환기 쉘 기능에 대한 상대 경로

  • 유틸리티가 필요하지 않습니다 (단지 cdpwd)
  • 디렉토리와 파일에 사용
  • 손잡이 ...
  • dir 또는 filename에서 공백을 처리합니다.
  • 파일 또는 디렉토리가 있어야합니다.
  • 주어진 경로에 아무것도 없으면 아무것도 반환하지 않습니다.
  • 절대 경로를 입력으로 처리 (기본적으로 통과)

암호:

function abspath() {
    # generate absolute path from relative path
    # $1     : relative filename
    # return : absolute path
    if [ -d "$1" ]; then
        # dir
        (cd "$1"; pwd)
    elif [ -f "$1" ]; then
        # file
        if [[ $1 = /* ]]; then
            echo "$1"
        elif [[ $1 == */* ]]; then
            echo "$(cd "${1%/*}"; pwd)/${1##*/}"
        else
            echo "$(pwd)/$1"
        fi
    fi
}

견본:

# assume inside /parent/cur
abspath file.txt        => /parent/cur/file.txt
abspath .               => /parent/cur
abspath ..              => /parent
abspath ../dir/file.txt => /parent/dir/file.txt
abspath ../dir/../dir   => /parent/dir          # anything cd can handle
abspath doesnotexist    =>                      # empty result if file/dir does not exist
abspath /file.txt       => /file.txt            # handle absolute path input

참고 : 이것은 nolan6000bsingh 의 답변 기반으로합니다. 하지만 파일 케이스를 수정합니다.

또한 원래 질문은 기존 명령 줄 유틸리티에 대한 것임을 이해합니다. 그러나 이것이 최소한의 종속성을 갖고 싶어하는 쉘 스크립트를 포함하여 스택 오버 플로우에 대한 질문 인 것처럼 보이기 때문에이 스크립트 솔루션을 여기에 배치하여 나중에 찾을 수 있습니다. :)


감사. OSX에서 그와 함께하는 것
Greg

공백이있는 디렉토리에서는 작동하지 않습니다. $ abspath 'a b c/file.txt'즉, 인수 cd가 인용되어 있지 않기 때문 입니다. 이를 극복하기 위해 전체 인수를 인용하는 대신 echo(이러한 인용의 이유가 있습니까?) 경로 인수 만 인용하십시오. 즉 교체 echo "$(cd ${1%/*}; pwd)/${1##*/}"와 함께 echo $(cd "${1%/*}"; pwd)/${1##*/}.
george

@george 감사합니다. 고쳤습니다.
Alexander Klimetschek

1
나는 수십 개의 반 코킹 솔루션을 살펴 보았으며 이것이 가장 간결하고 정확한 bash 전용 솔루션 인 것 같습니다. 로 교체 echo "$(cd "$1"; pwd)"하여 더 슬림화 할 수 있습니다 (cd "$1"; pwd). 여기에 에코가 필요하지 않습니다.
Six

@Six True, 업데이트되었습니다. 중괄호 ( ... )는 여전히 필요하므로의 cd호출자에 대한 작업 디렉토리를 변경하고 싶지 않기 때문에 서브 쉘 에서 발생합니다 abspath.
Alexander Klimetschek 1

24

find명령이 도움 이 될 수 있습니다

find $PWD -name ex*
find $PWD -name example.log

패턴과 일치하는 이름으로 현재 디렉토리의 내부 또는 아래에있는 모든 파일을 나열합니다. 몇 가지 결과 만 얻는다면 단순화 할 수 있습니다 (예 : 파일이 적은 트리 하단 근처의 디렉토리).

find $PWD

다른 유틸리티가 언급되지 않은 Solaris 10에서 이것을 사용합니다.


1
나는이 글을 처음 읽었을 때 그 말을하지 않았다. 여기서 중요한 점은 find 명령에 대한 절대 경로를 제공하면 결과가 절대 경로로 출력된다는 것입니다. 따라서 $ PWD를 사용하는 것은 당신이있는 곳의 절대 경로이므로 출력을 절대로 얻습니다.
simbo1905

4
당신이 의지한다면 PWD, 당신은 단순히 사용할 수 있습니다 $PWD/$filename.
jonny

이 접근 방식은 -maxdepth 1을 사용하여 개선 할 수 있습니다. 또한 사용 방법에 따라 여기에서 잠재적 보안 문제를 인용하는 것을 잊지 마십시오.
mc0e

1
@jonny : $ filename이 이미 절대적인 경우 $ PWD / $ filename이 실패합니다.
mc0e

파일 이름이 "./filename.txt"(앞에 점과 슬래시 포함)로 제공되면 실패합니다.
Mark Stosberg

15

readlink 또는 realpath 유틸리티가없는 경우 bash 및 zsh에서 작동하는 다음 기능을 사용할 수 있습니다 (나머지는 확실하지 않음).

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

이것은 존재하지 않는 파일에서도 작동합니다 (파이썬 기능과 마찬가지로) os.path.abspath ).

불행히도 abspath ./../somefile점을 제거하지 않습니다.


1
나에게 휴대용 보인다. 반면에, 예를 들어 줄 바꿈이 포함 된 파일 이름에서 끊어집니다.
로마 Cheplyaka

1
대체, 추가 개선하기 echo "$1"printf "%s\n" "$1"(제 에코와 동일). echo인수 내에서 백 슬래시를 해석 할 수 있습니다.
로마 Cheplyaka

다시, 당신 말이 맞아요! 실제로 zsh에서 echo 명령의 동작은 bash와 다릅니다.
hluk

1
엄밀히 말하면, 인수에 백 슬래시가 포함 된 경우 POSIX 에코의 동작은 정의되지 않습니다. 그러나 XSI 확장명으로 정의됩니다 (즉, echo는 이스케이프 시퀀스를 해석해야 함). 그러나 bash와 zsh는 POSIX 준수와는 거리가 멀다.
Roman Cheplyaka

미안하지만 요점은 보이지 않습니다. 나는 이미 더 많은 기능을 가진 스크립트로 답변을 제공했으며 쉘 스크립트 내에서 사용할 필요는 없습니다.
dhardy

10

다음은 컴팩트 함을 좋아하는 zsh 전용 함수입니다. 'A'확장 수정자를 사용합니다 (zshexpn (1) 참조).

realpath() { for f in "$@"; do echo ${f}(:A); done }

와우, 그것은 우아한 해결책입니다 !!
ShellFish

6

일반적으로 파일에 대한 absolute path 내용은 없습니다 (이 문장은 일반적으로 둘 이상이있을 수 있으므로 정관사를 사용 하는 것이 적절하지 않음을 의미합니다). 는 absolute path"/"루트에서 시작하는 어떤 경로와 독립적으로 작업 디렉토리의 모호성없이 파일을 지정합니다. (예를 들어 대한 참조 위키 피 디아 ).

A relative path는 다른 디렉토리에서 시작하여 해석되는 경로입니다. relative path응용 프로그램이 조작 하는 경우 작업 디렉토리 일 수 있습니다 (필수는 아님). 디렉토리의 심볼릭 링크에있는 경우 일반적으로 해당 디렉토리와 관련이 있습니다 (사용자는 다른 용도를 염두에 둘 수 있음).

따라서 절대 경로는 루트 디렉토리에 상대적인 경로 일뿐입니다.

경로 (절대 또는 상대)는 기호 링크를 포함하거나 포함하지 않을 수 있습니다. 그렇지 않은 경우 연결 구조의 변경에도 다소 영향을 미치지 않지만 반드시 필요하거나 바람직하지는 않습니다. 어떤 사람들은 모든 상징적 연결이 해결 된, 즉 그들이 연결되는 경로로 대체 된 canonical path(또는 canonical file name또는 resolved path)을 호출 absolute path합니다. 명령 realpathreadlink둘 다 정식 경로를 찾지 만 realpath심볼릭 링크를 해결하지 않고 절대 경로를 얻는 옵션 만 있습니다 (몇 가지 다른 옵션과 함께 절대 또는 일부 디렉토리에 상대적인 경로를 얻는 다른 옵션과 함께).

이를 위해서는 몇 가지 언급이 필요합니다.

  1. 심볼릭 링크는 링크 할 대상이 이미 생성 된 경우에만 확인할 수 있으며, 반드시 그런 것은 아닙니다. 명령 realpathreadlink이를 설명하는 옵션이 있습니다.
  2. 경로의 디렉토리는 나중에 기호 링크가 될 수 있으며, 이는 경로가 더 이상 존재하지 않음을 의미합니다 canonical. 따라서 개념은 시간 (또는 환경)에 따라 다릅니다.
  3. 이상적인 경우에도 모든 심볼릭 링크를 확인할 수있는 canonical path경우 두 가지 이유로 파일에 둘 이상이 있을 수 있습니다 .
    • 파일이 포함 된 파티션이 ro여러 마운트 지점에서 동시에 마운트되었을 수 있습니다 ( ).
    • 파일에 대한 하드 링크가있을 수 있습니다. 이는 파일이 여러 다른 디렉토리에 존재한다는 것을 의미합니다.

따라서을 훨씬 더 제한적으로 정의하더라도 canonical path파일에 대한 몇 가지 정식 경로가있을 수 있습니다. 이는 또한 한정자 canonical가 일반적으로 고유성 개념을 암시하기 때문에 다소 부적합하다는 것을 의미합니다.

이것은 Bash의 다른 유사한 질문에 대한 답변에서 주제에 대한 간단한 토론을 확장합니다 .

내 결론은 realpath보다 나은 디자인과 유연성보다 낫습니다 readlink. 이를 사용 readlink하지 않는 유일한 방법은 realpath심볼릭 링크의 값을 반환하는 옵션이없는 호출입니다.


다운 보트가 마음에 들지는 않지만 기술적 인 부분이나 사이트에서 적절한 방법으로 간주되는 부분에 대해 배울 수 있도록 이유를 이해하고 싶습니다. 글쎄 ... 적어도 지역 사회학을 더 잘 이해하기 위해 Meta Stack Overflow 에 등록하도록 유도했습니다 . 나는 그것을 추천합니다. -그래도 누군가 내 대답의 부적절성에 대한 의견을 가지고 있다면 관심이 있습니다.
babou

1
(a) 2 + 1 / 2 년 전의 질문에 유효한 답변이 있습니다. (b) 상대 경로 (내가 원하는 것)에 해당하는 (단일) 절대 경로 가 있지만 파일은 아닙니다. 지적했다. BTW에 대한 의견 realpathreadlink또는 기호 링크에 대해 내가 무엇을 요구 잉여 있습니다.
dhardy

1
두 번째 의견 : 짧은 답변은 긴 강의보다 훨씬 유용합니다. 스택 오버플로는 일반적으로 특정 질문을하는 데 사용됩니다.
dhardy

5
1- 질문에 대한 답변이 오랫동안 유효했다는 것이 문을 닫았다는 의미는 아닙니다. 질문은 개인적인 용도로만 사용되는 것이 아닙니다. 실제로, 검증 된 답변보다 더 많은 투표를 수집하는 답글 배지가 있습니다. 새로운 도구를 사용하면 "최상의"답변이 시간이 지남에 따라 변경 될 수 있습니다. 많은 사람들이 웹 검색을 통해 액세스 한 기존 답변을 사용합니다.
babou

1
2- 상대 경로에 해당하는 (단일) 절대 경로가 있다고 주장합니다 . "대응"이 의미하는 바, 즉 주어진 변형 세트를 통해 원본에서 파생 된 경로를 추측하지만 귀하의 진술은 여전히 ​​옳지 않습니다. 고유 한 "해당"정식 경로가 있습니다. 이 단어 canonical는 일련의 변형과 관련하여이 고유성을 정확하게 나타냅니다. 그러나 예를 들어 / dev / cdrom은 실제로 / dev / sr0에 대한 링크 임에도 불구하고 완벽하게 좋은 절대 경로입니다. 둘 다 같은 장치를 가리 킵니다. 내 원래 답변은 관련 웹 기사를 가리 켰습니다.
babou

5

dogbane 대답 에 오는 것을 설명과 :

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"

설명:

  1. 이 스크립트는 상대 경로를 인수로 얻습니다. "$1"
  2. 그런 다음 해당 경로의 dirname 부분을 얻습니다 (dir 또는 file을이 스크립트에 전달할 수 있음).dirname "$1"
  3. 그런 다음 cd "$(dirname "$1")이 상대 디렉토리로 들어가서 pwd쉘 명령 을 실행하여 절대 경로를 얻습니다.
  4. 그런 다음 절대 경로에 기본 이름 을 추가 합니다.$(basename "$1")
  5. 마지막 단계는 우리로 echo그것을

2

디렉토리 dirname가 트립 ../되고를 반환합니다 ./.

nolan6000의 기능 을 수정하여 다음을 해결할 수 있습니다.

get_abs_filename() {
  # $1 : relative filename
  if [ -d "${1%/*}" ]; then
    echo "$(cd ${1%/*}; pwd)/${1##*/}"
  fi
}

1
SO에 오신 것을 환영합니다! 작은 변경 및 설명의 경우, 기존 답변에 주석을 추가하는 것이 답변을 추가하는 것보다 특히 적합 할 수 있습니다. 특히이 복사 된 답변에 원래 답변에 대한 다른 정보가 많이없는 경우입니다. 좀 더 명성을 얻으면 다른 사람의 답변에 의견을 추가 할 수 있습니다. 지금은 독특하고 가치있는 질문을하거나 독립적이고 좋은 답변을 제공하여 평판을 얻으십시오.
cfi

1
당신은 nolan6000의 대답을 언급하고 있기 때문에, 포스터 dhardy는 그가 대본을 찾지 않기 때문에 nolan6000의 대답을 받아들이지 않을 것이라고 이미 언급했습니다. 따라서 엄격하게 대답하면 대답하지 않습니다.
cfi

기능을 추가하여 .profile대화식으로 사용할 수 있습니다.
adib

이 경우 작동하지 않습니다 $1일반 파일 이름입니다 : get_abs_filename foo-> 아무것도 (또는 <current_dir>/foo/foo경우 foo디렉토리입니다).
ivan_pozdeev

2

이것은 질문에 대한 답변이 아니라 스크립팅을하는 사람들을위한 것입니다.

echo `cd "$1" 2>/dev/null&&pwd||(cd "$(dirname "$1")";pwd|sed "s|/*\$|/${1##*/}|")`

/ .. ./ 등을 올바르게 처리합니다. 나는 또한 OSX에서 일하는 것 같다


2

나는 내 시스템에 다음 스크립트를 배치했으며 현재 디렉토리의 파일에 대한 전체 경로를 빠르게 잡고 싶을 때 이것을 bash 별칭이라고 부릅니다.

#!/bin/bash
/usr/bin/find "$PWD" -maxdepth 1 -mindepth 1 -name "$1"

이유는 확실하지 않지만 "$ PWD"스크립트에 의해 호출 될 때 OS X에서 절대 경로로 확장됩니다. find 명령이 명령 행에서 호출 될 때 호출되지 않습니다. 그러나 그것은 내가 원하는 것을한다.


$PWD항상 작업 디렉토리의 절대 경로가 있습니다. 또한 find슬래시를 허용하지 않으므로 요청에 따라 질문에 대답하지 않습니다. 당신이하고 싶은 일을하는 더 빠른 방법은 간단 할 것입니다echo "$PWD/$1"
Adam Katz

2

내장 만 사용하려는 경우 가장 간단한 방법은 다음과 같습니다.

find `pwd` -name fileName

두 단어 만 입력하면 OSX뿐만 아니라 모든 유닉스 시스템에서 작동합니다.


-maxdepth 1이전에 추가 할 것입니다 -name(파일이 현재 디렉토리에 있다고 가정). 그렇지 않으면 pwd의 하위 디렉토리에있는 파일을 사용할 수 있지만 다른 디렉토리에는 사용할 수 없습니다.
월터 트 로스

실제로 당신은 옳습니다. 질문은 파일이 현재 디렉토리에있을 것이라고 지정했습니다. "다른 사람들이 아니라"는 무슨 뜻입니까?
Arj

내 말은 find디렉토리 트리 아래에 외부 파일을 찾을 수 없습니다 pwd. 예를 들어, 시도 find . -name ../existingFile하면 실패합니다.
Walter Tross

당연히, 그래, 이것은 당신이 당신의 cwd (원래 질문에 따라) 또는 cwd 트리의 어디에서든지 (원래 질문이 아닌) 파일의 전체 경로를 인쇄하려고한다고 가정합니다.
Arj

1
#! /bin/bash

file="$@"
realpath "$file" 2>/dev/null || eval realpath $(echo $file | sed 's/ /\\ /g')

이것은 단점을 보완 realpath하여 쉘 스크립트에 저장합니다 fullpath. 이제 전화 할 수 있습니다 :

$ cd && touch a\ a && rm A 2>/dev/null 
$ fullpath "a a"
/home/user/a a
$ fullpath ~/a\ a
/home/user/a a
$ fullpath A
A: No such file or directory.

무엇을 해결합니까? realpath "foo bar"-> /home/myname/foo bar. 명령 줄 인수를 인용하지 않아도 문제가 아닙니다 realpath.
ivan_pozdeev

동의, 그것은 더 편리한 포장지입니다.
ShellFish

1

루비 에서 절대 경로를 얻는 대안 :

realpath() {ruby -e "require 'Pathname'; puts Pathname.new('$1').realpath.to_s";}

인수가없는 인수 (현재 폴더) 및 상대 및 절대 파일 또는 폴더 경로와 함께 작동합니다.


0

Homebrew로 답변

realpath가장 좋은 대답이지만 설치하지 않은 경우 먼저 멋진 기능을 많이 갖춘 coreutilsbrew install coreutils설치 해야합니다 . 사용자 정의 함수를 작성하고 내 보내면 작업이 너무 많아서 다음과 같은 오류가 발생할 위험이 있습니다.

$ brew install coreutils
$ realpath your-file-name.json 

-1

얘들 아 나는 그것이 오래된 실이라는 것을 알고 있지만 나처럼 이것을 방문한 다른 사람을 참조하기 위해 이것을 게시하고 있습니다. 질문을 올바르게 이해하면 locate $filename명령을 생각합니다 . 제공된 파일의 절대 경로를 표시하지만 존재하는 경우에만 표시합니다.


4
locate이름으로 파일 / 경로를 검색하는 유틸리티입니다. 작업을 수행 할 수도 있지만 다른 일치 항목을 찾을 수도 있고 updatedb루트로 먼저 호출하지 않고 기존 파일을 찾지 못할 수도 있습니다 .
dhardy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.