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

질문 : 공급하는 파일의 절대 경로를 인쇄하는 간단한 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)



답변

시도하십시오 realpath.

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


답변

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

readlink -e /foo/bar/baz


답변

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


답변

잊어 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
}


답변

$ readlink -m FILE
/path/to/FILE

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


답변

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

  • 유틸리티가 필요하지 않습니다 (단지 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 의 답변 기반으로합니다. 하지만 파일 케이스를 수정합니다.

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


답변

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

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

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

find $PWD

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