OS X에서 임의 파일의 절대 경로를 검색하는 방법

OS X에서 임의 파일의 절대 경로를 검색하는 방법

나는 OS X에서 파일에 대한 절대적이고 표준화된 경로를 찾기 위해 Bash 내에서 사용할 수 있는 간단한 명령을 찾고 있습니다(Linux의 ``readlink -f'`와 유사).

다음 샘플 bash 세션은 원하는 동작을 나타내는 ``abspath'`라는 [가상의] 유틸리티를 설명합니다.

$ pwd
/Users/guyfleegman

$ ls -lR
drwxr-xr-x  4 guyfleegman  crew  136 Oct 30 02:09 foo

./foo:
-rw-r--r--  1 guyfleegman  crew  0 Oct 30 02:07 bar.txt
lrwxr-xr-x  1 guyfleegman  crew  7 Oct 30 02:09 baz.txt -> bar.txt


$ abspath .
/Users/guyfleegman

$ abspath foo
/Users/guyfleegman/foo

$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt

$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt

위의 예에서 ``abspath''의 마지막 호출과 마찬가지로 심볼릭 링크를 자동으로 해결하지 않았으면 좋겠지만 여기서는 너무 까다롭게 다루지 않겠습니다.

답변1

function abspath() { pushd . > /dev/null; if [ -d "$1" ]; then cd "$1"; dirs -l +0; else cd "`dirname \"$1\"`"; cur_dir=`dirs -l +0`; if [ "$cur_dir" == "/" ]; then echo "$cur_dir`basename \"$1\"`"; else echo "$cur_dir/`basename \"$1\"`"; fi; fi; popd > /dev/null; }

예:

abspath / => /

abspath /.DS_Store => /.DS_Store

abspath ~ => /Users/mschrag

cd /tmp; abspath . => /tmp

cd /; abspath .DS_Store => /.DS_Store

답변2

이 작업을 수행하는 내장 명령이 없다고 생각합니다.제시 윌슨이를 위해 bash 스크립트를 작성했습니다.

#!/bin/bash
cd -P -- "$(dirname -- "$1")" &&
printf '%s\n' "$(pwd -P)/$(basename -- "$1")"

그러나 (인쇄 ) 및 및 ( 두 경우 모두 인쇄 ) /와 같이 바로 아래의 경로에서는 제대로 작동하지 않습니다 . 나는 그것을 수정하려고 시도했지만 불충분한 bash-fu로 인해 실패했습니다./etc//etc.../cwd/.

내 제안은 다음과 같습니다.

#!/usr/bin/env python
import os.path
import sys

for arg in sys.argv[1:]:
    print os.path.abspath(arg)

/usr/bin/abspath다른 이름 으로 저장하거나 실행 가능하게 만드십시오. 샘플 출력:

Servus08:~ danielbeck$ abspath .
/Users/danielbeck
Servus08:~ danielbeck$ abspath /tmp
/tmp
Servus08:~ danielbeck$ abspath Documents
/Users/danielbeck/Documents
Servus08:~ danielbeck$ abspath . /tmp Documents
/Users/danielbeck
/tmp
/Users/danielbeck/Documents

만약 너라면하다심볼릭 링크 해결을 원하면 print다음과 같이 줄을 변경하십시오.

    print os.path.realpath(os.path.abspath(arg))

이것을 얻으려면 :

Servus08:~ danielbeck$ abspath . /tmp Documents
/Users/danielbeck
/private/tmp
/Users/danielbeck/Documents

답변3

한 가지 옵션은 coreutils를 설치하고 greadlink -f. 심볼릭 링크를 확인하고 존재하지 않는 경우에는 작동하지만 존재하지 않는 경우에는 /Foo/작동 하지 않습니다 .~/foo.txt/Foo/foo.txt/Foo/

$ brew install coreutils
$ greadlink -f /etc
/private/etc
$ greadlink -f ~/Documents/
/Users/lauri/Documents
$ greadlink -f ..
/Users
$ greadlink -f //etc/..////
/private
$ greadlink -f /Foo
/Foo
$ greadlink -f /Foo/foo.txt
$ 

이렇게 하면 심볼릭 링크가 해결되지 않으며 어느 쪽에서도 작동하지 않습니다 /Foo/foo.txt.

abspath() {
  if [ -d "$1" ]; then
    ( cd "$1"; dirs -l +0 )
  else
    ( cd "$(dirname "$1")"; d=$(dirs -l +0); echo "${d%/}/${1##*/}" )
  fi
}

abspath /etc # /etc
abspath ~/Foo/foo.txt # doesn't work
abspath ~/Foo # works
abspath .
abspath ./
abspath ../
abspath ..
abspath /
abspath ~
abspath ~/
abspath ~/Documents
abspath /\"\ \'
abspath /etc/../etc/
abspath /private//etc/
abspath /private//
abspath //private # //private
abspath ./aa.txt
abspath aa.tar.gz
abspath .aa.txt
abspath /.DS_Store
abspath ~/Documents/Books/

dirs -l물결표 확장을 수행합니다. dirs +0스택에 다른 디렉터리가 있는 경우 최상위 디렉터리만 인쇄합니다.

답변4

Perl용 File::Spec 모듈이 설치되어 있으면 다음과 같이 할 수 있습니다:

perl -MFile::Spec -e 'print File::Spec->rel2abs("../however/complex/../you/want/to.get"), "\n"'

관련 정보