Ottieni la directory principale per un file


24

Voglio ottenere solo il nome della directory principale per un file.

Esempio: quando ho path=/a/b/c/d/file, voglio solo de non /a/b/c/d(da cui ottengo dirname $path) come output.

C'è un modo sofisticato per farlo?

Risposte:


26

Sembra che tu voglia il nome di base del dirname:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

perché sto ricevendo. invece della directory principale su debian?
Amir,

@Amir: stai iniziando con un percorso completo o solo con un nome file? Se è solo un nome file, il dirnamecomando assumerà che si trovi nella directory corrente (aka ".").
Gordon Davisson,

bene, sto usando questo:parentname="$(basename "$(dirname "$pwd")")"
Amir,

1
@Amir: le variabili Shell fanno distinzione tra maiuscole e minuscole e PWDdevono essere maiuscole. Prova parentname="$(basename "$(dirname "$PWD")")".
Gordon Davisson,

5

È possibile utilizzare pwd per ottenere la directory di lavoro corrente e utilizzare l' espansione dei parametri per evitare di inserirla in un'altra (sotto) shell.

echo ${PWD##*/}

Modifica: fonte comprovata


La domanda non ha nulla a che fare con la directory corrente. Puoi usare${path##*/}
Matteo

2

Penso che questa sia una soluzione con meno risorse:

 $ filepath=/a/b/c/d/file
 $ echo ${${filepath%/*}##*/}
 d

edit: Siamo spiacenti, l'espansione nidificata non è possibile in bash, ma funziona in zsh. Bash-Versione:

 $ filepath=/a/b/c/d/file
 $ path=${filepath%/*}
 $ echo ${path##*/}
 d

Esistono alcuni casi limite che non gestiscono bene, soprattutto quando non esiste un percorso multilivello completo. Ad esempio, provalo con filepath=fileo filepath = / file`.
Gordon Davisson,

Infatti. Ma qual è la directory principale di foofile? Se non è il percorso completo non può saperlo (forse se foofileun file esistente non è solo una "stringa").
sciopero

1

In bash, in una riga:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
puoi per favore elaborare le procedure coinvolte? può essere di aiuto per i futuri lettori. inoltre, cerca di non scrivere risposte a 1/2 riga.
Lorenzo Von Matterhorn,

0

Mi piace la risposta di Julian67 sopra, ma ecco una versione ampliata:

file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;')  # cut away "/a/b/c/"
echo $parent # --> you get "d"
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.