입력 파일을 인수로 사용하여 읽는 bash 스크립트를 작성했습니다.
이 파일에는 사용 된 추가 파일에 대한 일부 경로 (위치 기준)가 포함되어 있습니다.
추가 명령을 실행하기 위해 스크립트를 입력 파일이 포함 된 폴더로 이동하고 싶습니다.
그렇다면 입력 파일에서 폴더 (및 폴더 만)를 가져 오는 방법은 무엇입니까? (리눅스에서.)
답변
전체 경로를 얻으려면 다음을 사용하십시오.
readlink -f relative/path/to/file
파일의 디렉토리를 얻으려면 :
dirname relative/path/to/file
두 가지를 결합 할 수도 있습니다.
dirname $(readlink -f relative/path/to/file)
readlink -f
시스템에서를 사용할 수없는 경우 다음을 사용할 수 있습니다. * :
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
상대 경로로 지정된 파일의 디렉토리로만 이동해야하는 경우 절대 경로를 알 필요가 없으며 상대 경로는 완벽하게 합법적이므로 다음을 사용하십시오.
cd $(dirname relative/path/to/file)
당신이 (스크립트가 실행되는 동안) 원래 경로로 다시 이동하려는 경우, 사용 pushd
대신에 cd
, 그리고 popd
당신이 완료되면.
*myreadlink
위의 내용은이 질문의 맥락에서 충분 하지만 위에서 readlink
제안한 도구와 관련하여 약간의 제한이 있습니다. 예를 들어 .NET Framework가 다른 파일에 대한 링크를 올바르게 따르지 않습니다 basename
.
답변
에 대한 맨 페이지를 살펴보면 realpath
다음과 같은 것을 사용합니다.
CONTAININGDIR = $ (실제 경로 $ {FILEPATH % / *})
당신이하려는 것처럼 들리는 것을 할 수 있습니다.
답변
이것은 파일과 폴더 모두에서 작동합니다.
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}
답변
$cat abs.sh
#!/bin/bash
echo "$(cd "$(dirname "$1")"; pwd -P)"
몇 가지 설명 :
- 이 스크립트는 상대 경로를 인수로 가져옵니다.
"$1"
- 그런 다음 해당 경로의 dirname 부분을 얻습니다 (이 스크립트에 dir 또는 파일을 전달할 수 있음).
dirname "$1"
- 그런 다음 우리
cd "$(dirname "$1");
는이 상대 디렉토리에 pwd -P
절대 경로를 얻으십시오. 이-P
옵션은 심볼릭 링크를 피합니다.- 마지막 단계는 우리로
echo
그것을
그런 다음 스크립트를 실행하십시오.
abs.sh your_file.txt
답변
GitHub에서 새로운 Bash 라이브러리 제품인 realpath-lib 를 사용해보십시오. GitHub는 무료로 제한없이 사용할 수 있도록 커뮤니티에 제공했습니다. 깨끗하고 간단하며 잘 문서화되어 있으므로 배우는 것이 좋습니다. 넌 할 수있어:
get_realpath <absolute|relative|symlink|local file path>
이 기능은 라이브러리의 핵심입니다.
if [[ -f "$1" ]]
then
# file *must* exist
if cd "$(echo "${1%/*}")" &>/dev/null
then
# file *may* not be local
# exception is ./file.ext
# try 'cd .; cd -;' *works!*
local tmppwd="$PWD"
cd - &>/dev/null
else
# file *must* be local
local tmppwd="$PWD"
fi
else
# file *cannot* exist
return 1 # failure
fi
# reassemble realpath
echo "$tmppwd"/"${1##*/}"
return 0 # success
}
Bash 4+이며 종속성이 필요하지 않으며 get_dirname, get_filename, get_stemname 및 validate_path도 제공합니다.
답변
위 답변의 문제는 “./my-file.txt”와 같이 “./”로 입력 된 파일과 함께 제공됩니다.
해결 방법 (다수) :
myfile="./somefile.txt"
FOLDER="$(dirname $(readlink -f "${ARG}"))"
echo ${FOLDER}
답변
나는 readlink -f를 사용하고 있습니다.
그래서
FULL_PATH=$(readlink -f filename)
DIR=$(dirname $FULL_PATH)
PWD=$(pwd)
cd $DIR
#<do more work>
cd $PWD