programing

전체 경로 없이 현재 디렉토리 또는 폴더 이름 가져오기

yellowcard 2023. 5. 10. 20:46
반응형

전체 경로 없이 현재 디렉토리 또는 폴더 이름 가져오기

bash 스크립트에서 현재 작업 디렉터리/폴더 이름을 검색하려면 어떻게 해야 합니까, 더 나은 것은 터미널 명령입니다.

pwd현재 작업 디렉터리의 전체 경로를 제공합니다./opt/local/bin하지만 난 그저bin.

기본 이름이 필요하지 않으며, 특히 pwd를 실행하는 하위 셸이 필요하지 않습니다. (추가적이고 값비싼 포크 작업을 추가합니다.) 셸은 매개 변수 확장을 사용하여 내부적으로 이 작업을 수행할 수 있습니다.

result=${PWD##*/}          # to assign to a variable
result=${result:-/}        # to correct for the case where PWD=/

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의 extglobal 지원을 사용하여 여러 후행 슬래시에서도 작동합니다.

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
result=${result:-/}        # correct for dirname=/ case
printf '%s\n' "$result"

또는 사용하지 않음extglob:

dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}"                  # remove everything before the last /
result=${result:-/}                     # correct for dirname=/ case

프로그램을 사용합니다.귀하의 경우:

% basename "$PWD"
bin
$ echo "${PWD##*/}"

​​​​​

사용:

basename "$PWD"

OR

IFS=/ 
var=($PWD)
echo ${var[-1]} 

IFS(Internal Filename Separator)를 공간으로 되돌립니다.

IFS= 

IFS 뒤에 공간이 하나 있습니다.

pwd와 base name의 조합을 사용할 수 있습니다.예.

#!/bin/bash

CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`

echo "$BASENAME"

exit;

grep은 어때요?

pwd | grep -o '[^/]*$'

이 실은 정말 멋집니다!맛이 하나 더 있습니다.

pwd | awk -F / '{print $NF}'
basename $(pwd)

또는

echo "$(basename $(pwd))"

저는 선택된 답변(찰스 더피)을 좋아하지만, 당신이 링크된 디르에 있고 당신이 대상 디르의 이름을 원한다면 조심하세요.유감스럽게도 단일 매개 변수 확장 식으로는 수행할 수 없다고 생각합니다. 제가 잘못 알고 있는 것 같습니다.이렇게 하면 됩니다.

target_PWD=$(readlink -f .)
echo ${target_PWD##*/}

이를 확인하기 위한 실험:

cd foo
ln -s . bar
echo ${PWD##*/}

리포트"bar"

DIRNAME

/usr/bin/dirname의 포크 실행 없이 경로의 선행 디렉토리를 표시하려면:

echo ${target_PWD%/*}

예를 들어 foo/bar/baz -> foo/bar를 변환합니다.

echo "$PWD" | sed 's!.*/!!'

본 셸을 사용하는 경우 또는${PWD##*/}사용할 수 없습니다.

놀랍게도, 아무도 내장된 bash 명령만 사용하는 이 대안을 언급하지 않았습니다.

i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"

추가 보너스로 다음을 사용하여 상위 디렉토리의 이름을 쉽게 얻을 수 있습니다.

[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"

이러한 기능은 Bash 4.3-alpha 이상에서 작동합니다.

새로운 과정을 피하기 때문에 특히 찰스 방식을 좋아했지만, 이것을 알기 전에 어색하게 해결했습니다.

pwd | awk -F/ '{print $NF}'

나 같은 기수를 찾으려면,

find $PWD -maxdepth 0 -printf "%f\n"

저는 주로 이 insh 스크립트를 사용합니다.

SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder

이를 사용하여 작업을 자동화할 수 있습니다.

그냥 사용:

pwd | xargs basename

또는

basename "`pwd`"

regex를 사용하는 아래의 grep도 작동하고 있습니다.

>pwd | grep -o "\w*-*$"

bash 프롬프트 영역에 현재 디렉토리만 표시하려면.bashrc줄을 지어 들어가다~옷을 .바꾸다\w\W줄에:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

려달을 합니다.source ~/.bashrc디렉토리 이름은 프롬프트 영역에만 표시됩니다.

참조: https://superuser.com/questions/60555/show-only-current-directory-name-not-full-path-on-bash-prompt

다음 명령줄을 실행하기만 하면 됩니다.

basename $(pwd)

해당 이름을 복사하려는 경우:

basename $(pwd) | xclip -selection clipboard

여기에 이미지 설명 입력

저는 GNU 코어유틸리티의 일부인 를 사용하는 것을 강력히 선호합니다.

basname»

pwd | grep -o "[^/]*$"

OR

pwd | ack -o "[^/]+$"

내 껍데기는 그와 함께 오지 않았습니다.basename패키지와 저는 다른 방법이 있다면 패키지 다운로드를 피하는 경향이 있습니다.

다음은 간단한 별칭입니다.

별칭 이름='기본 이름 $(pwd)'

을 그을당것넣후에은에의신에 넣은 후에.~/.zshrc또는~/.bashrc 파일및소예싱예(:싱소▁file및ex:).source ~/.zshrc), 그러면 간단히 실행할 수 있습니다.name현재 디렉터리 이름을 인쇄합니다.

문자열에서 /로 끝나는 접두사와 접미사(문자열로 표시된 경우)를 삭제하고 표준 출력에 결과를 인쇄하는 기본 이름 유틸리티를 사용할 수 있습니다.

$basename <path-of-directory>

다음 시간까지 모든 문자를 제거합니다./(또는)\Windows(윈도우)를 사용하는 경우).을 부리듯 입니다./:

pwd | sed 's/.*\///g'

이 경우 결과는 예상대로입니다.

λ a='/opt/local/bin'

λ echo $a | sed 's/.*\///g'
bin

다음 명령을 실행하면 현재 작업 디렉터리가 bash 스크립트로 인쇄됩니다.

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

언급URL : https://stackoverflow.com/questions/1371261/get-current-directory-or-folder-name-without-the-full-path

반응형