Bash 펼쳐에서 현재 디렉토리 이름 (전체 경로 없음) 가져 오기
bash 펼쳐에서 현재 작업 디렉토리 이름을 얻는 방법, 또는 터미널 명령 만 얻을 수있는 방법은 무엇입니까?
pwd
예를 들어 현재 작업 디렉토리의 전체 경로를 제공 /opt/local/bin
하지만bin
베이스 이름이 필요 없으며, 특히 PWD를 실행하는 서브 쉘이 필요하지 않습니다 ( 추가적이고 값 비싼 포크 작업 추가 ). 쉘은 매개 변수 확장을 사용하여 내부적으로이를 수행 할 수 있습니다 .
result=${PWD##*/} # to assign to a variable
printf '%s\n' "${PWD##*/}" # to print to stdout
# ...more robust than echo for unusual names
# (consider a directory named -e or -n)
printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as shell input
# ...useful to make hidden characters readable.
이 기술을 다른 상황에서 적용하는 경우 (가 PWD
아니라 디렉토리 이름이있는 다른 변수) 후행 슬래시를 잘라 내야 할 수도 있습니다. 아래는 bash의 extglob 지원 을 사용 하여 여러 후행 슬래시로도 작동합니다.
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
또는 다음없이 extglob
:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
basename
프로그램을 사용하십시오 . 귀하의 경우 :
% basename "$PWD"
bin
$ echo "${PWD##*/}"
pwd와 basename의 조합을 사용할 수 있습니다. 예
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
grep은 어떻습니까?
pwd | grep -o '[^/]*$'
나는 선택 (Charles Duffy)을 좋아하지만 디렉토리에있는 디렉토리의 이름을 조심하십시오. 불행히도 단일 한 변수 확장 식으로 수행 할 수 있다고 생각하지. 작동합니다.
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
이를 확인하기 위해 실험 :
cd foo
ln -s . bar
echo ${PWD##*/}
"바"보고
DIRNAME
경로의 선행 디렉토리를 표시하려는 경우 (/ usr / bin / dirname의 fork-exec를 발생하고 발생하는 경우) :
echo ${target_PWD%/*}
이 예를 들어 변형 foo / bar / baz-> foo / bar
echo "$PWD" | sed 's!.*/!!'
Bourne 쉘을 사용 중이거나 ${PWD##*/}
사용할 수없는 경우.
이 훌륭합니다! 여기에 또 하나의 맛이 있습니다.
pwd | awk -F / '{print $NF}'
basename $(pwd)
또는
echo "$(basename $(pwd))"
놀랍게도 아무도 내장 된 bash 명령만을 사용하는 것이 참조하지 않습니다.
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
AS를 추가 보너스 당신은 쉽게 상위 디렉토리로의 이름을 얻을 수 있습니다 :
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"
Bash 4.3-alpha 이상에서 작동합니다.
나는 보통 이것을 sh 스크립트에서 사용합니다.
SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
이것을 사용하여 자동화 할 수 있습니다 ...
나와 같은 기수 찾기 :
find $PWD -maxdepth 0 -printf "%f\n"
정규식이있는 grep 아래에서도 작동합니다.
>pwd | grep -o "\w*-*$"
basename "$PWD"
또는
IFS=/
var=($PWD)
echo ${var[-1]}
내부 파일 이름 구분 기호 (IFS)를 다시 공백으로 바꿉니다.
IFS=
IFS = 뒤에 공백이 하나 있습니다.
/로 끝나는 접두사와 접미사 (문자열에있는 경우)를 문자열에서 삭제하고 결과를 표준 출력에 인쇄하는 basename 유틸리티를 사용할 수 있습니다.
$basename <path-of-directory>
다음을 사용하십시오.
pwd | xargs basename
또는
basename "`pwd`"
나는 gbasename
GNU coreutils의 일부인를 사용하는 것을 강력히 선호합니다 .
다음 명령은 bash 스크립트에서 현재 작업 디렉토리를 인쇄합니다.
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
이 명령을 사용합니다.
dirname "$0"
'ProgramingTip' 카테고리의 다른 글
데이터베이스, 테이블 및 열 명명 규칙? (0) | 2020.09.29 |
---|---|
typedef 골대 골 정의 (0) | 2020.09.29 |
if- 문에서의 && (논리 -and)에 해당 (0) | 2020.09.29 |
현재 변경 사항으로 Git 분기 만들기 (0) | 2020.09.29 |
Maven에게 최신 버전의 사용 지시를 사용합니까? (0) | 2020.09.29 |