[bash] 주어진 상대 경로를 검색하는 방법

상대 경로가 주어진 절대 경로를 검색하는 명령이 있습니까?

예를 들어 $ line에 dir에있는 각 파일의 절대 경로를 포함 시키려고합니다. ./etc/

find ./ -type f | while read line; do
   echo $line
done



답변

사용하다:

find "$(pwd)"/ -type f

모든 파일을 얻거나

echo "$(pwd)/$line"

전체 경로 표시 (상대 경로가 중요한 경우)


답변

시도하십시오 realpath.

~ $ sudo apt-get install realpath  # may already be installed
~ $ realpath .bashrc
/home/username/.bashrc

심볼릭 링크가 확장되지 않도록하려면을 사용하십시오 realpath -s.

대답은 ” 파일의 절대 경로를 인쇄하는 bash / fish 명령 “에서 나옵니다 .


답변

coreutils 패키지를 설치 한 경우 일반적으로 readlink -f relative_file_name절대 패키지 를 검색하기 위해 사용할 수 있습니다 (모든 심볼릭 링크가 해결됨)


답변

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

UPD 몇 가지 설명

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

답변

가치있는 것에 대해, 나는 선정 된 답변에 투표했지만 해결책을 공유하고 싶었습니다. 단점은 Linux뿐입니다 .Stack overflow에 오기 전에 OSX와 동등한 것을 찾으려고 약 5 분이 걸렸습니다. 그래도 확실합니다.

Linux readlink -e에서는와 함께 사용할 수 있습니다 dirname.

$(dirname $(readlink -e ../../../../etc/passwd))

수확량

/etc/

그런 다음 dirname자매 를 사용 basename하여 파일 이름을 가져옵니다.

$(basename ../../../../../passwd)

수확량

passwd

다 합쳐서 ..

F=../../../../../etc/passwd
echo "$(dirname $(readlink -e $F))/$(basename $F)"

수확량

/etc/passwd

디렉토리를 타겟팅하는 경우 안전 basename하고 아무것도 반환하지 않으며 최종 출력에서 ​​이중 슬래시로 끝납니다.


답변

나는 이것이 가장 휴대용이라고 생각합니다.

abspath() {
    cd "$(dirname "$1")"
    printf "%s/%s\n" "$(pwd)" "$(basename "$1")"
    cd "$OLDPWD"
}

경로가 존재하지 않으면 실패합니다.


답변

realpath 아마도 최고 일 것입니다

그러나 …

초기 질문은 시작하기에 매우 혼란 스러웠으며, 언급 된 질문과 관련이없는 예가 있습니다.

선택한 답변은 실제로 제목의 모든 질문이 아니라 주어진 예제에 답변합니다. 첫 번째 명령은 그 대답입니다 (정말입니까? 의심 스럽습니다). ‘/’없이도 잘 할 수 있습니다. 그리고 두 번째 명령이 무엇을하는지 보지 못했습니다.

몇 가지 문제가 혼합되어 있습니다.

  • 상대 경로 이름을 절대 경로로 변경합니다. ( 일반적으로와 같은 명령을 실행하는 경우 파일이 실제로 작성되기 전에 touch foo/bar경로 이름이 foo/bar있어야하며 계산에 사용되어야합니다. )

  • 경로상의 심볼릭 링크 (symlink)로 인해 동일한 파일 (또는 잠재적 파일)을 나타내는 몇 개의 절대 경로 이름이있을 수 있지만 다른 이유로 인해 장치가 읽기 전용으로 두 번 마운트 될 수 있습니다. 그러한 심볼릭 링크를 명시 적으로 해결하거나 원하지 않을 수 있습니다.

  • 심볼릭 링크가 아닌 파일 또는 이름에 대한 심볼릭 링크의 끝에 도달 이는 수행 방법에 따라 절대 경로 이름을 생성하거나 생성하지 않을 수 있습니다. 그리고 그것을 절대 경로 이름으로 해결하거나 원하지 않을 수 있습니다.

readlink foo옵션이없는 명령 은 인수가있는 경우에만 답변을 제공합니다foo 가 기호 링크 인 하며 해당 응답은 해당 심볼릭 링크의 값입니다. 다른 링크는 따르지 않습니다. 대답은 상대 경로 일 수 있습니다. symlink 인수의 값이 무엇이든간에.

하나, readlink 모든 파일에 대해 작동하는 옵션 (-f -e 또는 -m)이 있으며 실제로 인수로 표시된 파일에 대한 하나의 절대 경로 이름 (심볼 링크가없는 경로 이름)을 제공합니다.

이것은 경로의 중간 심볼릭 링크를 해결하지 않고 절대 경로 이름을 사용하고자 할 수도 있지만 심볼릭 링크가 아닌 모든 것에 잘 작동합니다. 이것은 명령에 의해 수행됩니다realpath -s foo

symlink 인수의 경우 readlink해당 옵션을 사용하면 인수의 절대 경로에있는 모든 symlink가 다시 해결되지만 인수 값에 따라 발생할 수있는 모든 symlink도 포함됩니다. 심볼릭 링크 자체에 대한 링크가 아닌 경로에 대한 절대 경로를 원한다면 원하지 않을 수도 있습니다. 다시 한 번 foo심볼릭 링크 인 경우 realpath -s foo인수로 제공된 심볼릭 링크를 포함하여 심볼릭 링크를 해결하지 않고 절대 경로를 얻습니다.

-s옵션이 없으면 단순히 링크의 값을 읽는 것 외에 몇 가지 다른 것을 제외 realpath하고는와 거의 동일
readlink합니다. readlink옵션이있는 이유 가 분명하지 않아서 바람직하지 않은 중복성을
realpath만듭니다.

웹 탐색은 시스템마다 약간의 차이가있을 수 있다는 점을 제외하고는 더 이상 말하지 않습니다.

결론 : realpath최소한 여기에 요청 된 용도에 대해 가장 유연하게 사용할 수있는 최상의 명령입니다.