come eliminare l'ultima barra del percorso della directory?


17

Ho uno script che richiede una directory come argomento. Voglio supportare i due moduli: uno è come

a/b/c

(nessuna barra alla fine) e un altro è come

 a/b/c/

(presenta una barra alla fine).

La mia domanda: data una delle due forme, come posso mantenere invariata la prima forma e rimuovere l'ultima barra della seconda forma per convertirla nella prima forma.


2
Non che dovrebbe essere un grosso problema: una doppia barra ovunque tranne all'inizio è equivalente a una singola barra, quindi non preoccuparti di unirti a loro usando /.
muru,

@muru non lo sapevo prima :).
Yulong Ao,


1
@muru Una barra alla fine può fare la differenza, come la differenza tra agire su un collegamento simbolico e agire sulla directory a cui punta o l'argomento sorgente di rsync.
Gilles 'SO- smetti di essere malvagio' il

@Gilles davvero, ma come puoi vedere, sto parlando di unire percorsi.
muru,

Risposte:


23
dir=${1%/}

prenderà il primo parametro dello script e rimuoverà una barra finale se ce n'è una.


12

Per rimuovere una barra finale, se presente, è possibile utilizzare il costrutto di espansione dei parametri di rimozione suffisso presente in tutte le shell in stile POSIX:

x=${x%/}

Ci sono alcune complicazioni. Questo rimuove solo una singola barra, quindi se hai iniziato con a/b/c//te finirai comunque con una barra. Inoltre, se il percorso originale era /, è necessario mantenere la barra. Ecco una soluzione più complessa che si occupa di questi casi:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

In alternativa, in ksh o in bash dopo shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

Si noti che in molti casi, non importa che ci sia una barra finale. Non importa se l'argomento è un collegamento simbolico a una directory: con una barra finale, l'argomento designa la directory, mentre senza barra finale, l'argomento designa il collegamento simbolico stesso. Importa anche con alcuni altri programmi, ad esempio l'argomento source di rsyncviene trattato in modo diverso a seconda della presenza di una barra finale.


2

realpathrisolve il percorso indicato. Tra le altre cose rimuove anche le barre finali. Utilizzare -sper impedire i seguenti simlink

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.