ProgramingTip

Bash 펼쳐에서 현재 디렉토리 이름 (전체 경로 없음) 가져 오기

bestdevel 2020. 9. 29. 08:14
반응형

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`"

나는 gbasenameGNU coreutils의 일부인를 사용하는 것을 강력히 선호합니다 .


다음 명령은 bash 스크립트에서 현재 작업 디렉토리를 인쇄합니다.

pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR

이 명령을 사용합니다.

dirname "$0"

참고 URL : https://stackoverflow.com/questions/1371261/get-current-directory-name-without-full-path-in-a-bash-script

반응형