Ottieni il nome della directory corrente (senza percorso completo) in uno script Bash

Come potrei ottenere solo il nome corrente della directory di lavoro in uno script bash, o meglio ancora, solo un comando terminale.

pwd fornisce il percorso completo della directory di lavoro corrente, ad esempio /opt/local/bin ma voglio solo bin

Non c’è bisogno di basename, e soprattutto non c’è bisogno di una subshell che esegue pwd (che aggiunge un’operazione extra, e costosa, di fork ); la shell può farlo internamente usando l’ espansione dei parametri :

 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. 

Utilizzare il programma basename . Per il tuo caso:

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

È ansible utilizzare una combinazione di pwd e basename. Per esempio

 #!/bin/bash CURRENT=`pwd` BASENAME=`basename "$CURRENT"` echo "$BASENAME" exit; 

Che ne dici di grep:

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

molto semplice

 pwd | xargs basename 

Mi piace la risposta selezionata (Charles Duffy), ma fai attenzione se sei in una directory symlinked e vuoi il nome della directory di destinazione. Sfortunatamente non penso che si possa fare con un’espressione di espansione a parametro singolo, forse mi sbaglio. Questo dovrebbe funzionare:

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

Per vedere questo, un esperimento:

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

segnala “bar”

DIRNAME

Per mostrare le directory principali di un percorso (senza incorrere in un fork-exec di / usr / bin / dirname):

 echo ${target_PWD%/*} 

Questo per esempio trasformsrà foo / bar / baz -> foo / bar

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

Se si utilizza la shell Bourne o ${PWD##*/} non è disponibile.

Questa discussione è fantastica! Ecco un altro sapore:

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

Sorprendentemente, nessuno ha menzionato questa alternativa che utilizza solo comandi bash incorporati:

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

Come bonus aggiuntivo puoi facilmente ottenere il nome della directory principale con:

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

Funzioneranno su Bash 4.3-alpha o più recente.

 basename $(pwd) 

o

 echo "$(basename $(pwd))" 

di solito uso questo in sh scripts

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

puoi usare questo per automatizzare le cose …

 basename "$PWD" 

O

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

Trasforma il nome del file interno Separator (IFS) in uno spazio.

 IFS= 

C’è uno spazio dopo IFS =.

È ansible utilizzare l’utilità basename che elimina qualsiasi prefisso che termina in / e il suffisso (se presente nella stringa) dalla stringa e stampa il risultato sullo standard output.

 $basename  

Basta usare:

 pwd | xargs basename 

o

 basename "`pwd`" 

Anche qui sotto grep con regex funziona,

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

Per trovare i fantini là fuori come me:

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

Preferisco fortemente usare gbasename , che fa parte dei coreutils GNU.

I seguenti comandi risulteranno nella stampa della directory di lavoro corrente in uno script bash.

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

Io uso questo comando:

dirname "$0"