簡體   English   中英

獲取當前目錄或文件夾名稱(沒有完整路徑)

[英]Get current directory or folder name (without the full path)

我如何在 bash 腳本中檢索當前工作目錄/文件夾名稱,或者更好的是,只是一個終端命令。

pwd給出了當前工作目錄的完整路徑,例如/opt/local/bin但我只想要bin

不需要 basename,尤其是不需要運行 pwd 的子 shell(這會增加額外的、昂貴的 fork 操作); shell 可以使用參數擴展在內部執行此操作:

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 的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
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程序。 對於您的情況:

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

​​​​​​​

利用:

basename "$PWD"

或者

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

將內部文件名分隔符 (IFS) 轉回空格。

IFS= 

IFS 后面有一個空格。

您可以使用密碼和基本名稱的組合。 例如

#!/bin/bash

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

echo "$BASENAME"

exit;

grep怎么樣:

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

或者

echo "$(basename $(pwd))"

這個線程很棒! 這里還有一種味道:

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

我喜歡選定的答案(Charles Duffy),但如果您在符號鏈接目錄中並且想要目標目錄的名稱,請小心。 不幸的是,我認為它不能在單個參數擴展表達式中完成,也許我弄錯了。 這應該有效:

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

為了看到這一點,一個實驗:

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

報告“酒吧”

目錄名

要顯示路徑的前導目錄(不產生 /usr/bin/dirname 的 fork-exec):

echo ${target_PWD%/*}

這將例如轉換 foo/bar/baz -> foo/bar

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

如果您使用的是 Bourne shell 或${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 或更高版本。

有很多方法我特別喜歡查爾斯的方式,因為它避免了一個新的過程,但在知道這一點之前,我用 awk 解決了它

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

對於像我這樣的尋找騎師:

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

我通常在 sh 腳本中使用它

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

在帶有正則表達式的 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

我非常喜歡使用gbasename ,它是 GNU coreutils 的一部分。

只需運行以下命令行:

basename $(pwd)

如果要復制該名稱:

basename $(pwd) | xclip -selection clipboard

在此處輸入圖像描述

basname示例的替代方法

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

要么

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

我的 shell 沒有附帶basename package,如果有辦法,我傾向於避免下載包。

您可以使用 basename 實用程序從字符串中刪除任何以 / 結尾的前綴和后綴(如果存在於字符串中),並在標准輸出上打印結果。

$basename <path-of-directory>

以下命令將導致在 bash 腳本中打印您當前的工作目錄。

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

只需刪除/之前的任何字符(或\ ,如果您在 Windows 上)。 由於比賽將變得貪婪,它將刪除所有內容,直到最后一個/

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

在您的情況下,結果符合預期:

λ a='/opt/local/bin'

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

我使用以下命令:

dirname "$0"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM