W Bash, VAR="/home/me/mydir/file.c"
jak mogę uzyskać "/home/me/mydir"
?
400
dirname
i basename
są to narzędzia, których szukasz do wyodrębnienia komponentów ścieżki:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Nie są to wewnętrzne komendy Bash, ale są częścią standardu POSIX (patrz dirname
, basename
) i dlatego powinny być dostępne w zdecydowanej większości systemów, w których działa Bash.
Aby uniknąć zależności z
basename
idirname
źródło
W powiązanej notatce, jeśli masz tylko nazwę pliku lub ścieżkę względną,
dirname
samo w sobie nie pomoże. Dla mnie odpowiedź była ostatecznareadlink
.Następnie możesz połączyć te dwa elementy, aby uzyskać tylko katalog.
źródło
readlink -m "$fname"
do kanonicznej rekurencyjnej podanej nazwyJeśli zależy ci na tym, aby pliki docelowe były linkami symbolicznymi, najpierw możesz to sprawdzić i uzyskać oryginalny plik. Poniższa klauzula if może ci pomóc.
źródło
Bawiłem się tym i wpadłem na alternatywę.
Najbardziej podobało mi się to, że łatwo było rozszerzyć kopię zapasową drzewa:
źródło
Oto skrypt, którego użyłem do przycinania rekurencyjnego. Oczywiście zamień $ 1 na żądany katalog.
źródło
Najpierw zastąpiłem
/
pustą spacją (). Następnie usunąłem wszystkie znaki przed pustą spacją (
). Na koniec usunąłem pierwszy znak, który jest pustą spacją (
).
źródło
gdzie otrzymujesz pełną ścieżkę z new_path =
$(dirname ${BASH_SOURCE[0]})
.cd
Zmieniasz bieżący katalog za pomocą new_path, a następnie biegniesz,pwd
aby uzyskać pełną ścieżkę do bieżącego katalogu.źródło