Przechodzisz do katalogu nadrzędnego pliku z cd?

9

Piszę .sh, żeby coś dla mnie zrobić, ale jestem teraz w punkcie, w którym muszę cd do katalogu, w którym znajduje się plik /path/to/file.end. Terminal nie pozwala

cd /path/to/file.end
bash: cd: /path/to/file.end: Not a directory

niestety nie znam żadnego obejścia, więc byłoby miło, gdybyś mógł pomóc!

Azsgy
źródło
4
Masz na myśli cd /path/to? Spowoduje to zmianę katalogu na katalog, w którym file.endznajduje się plik .
Alaa Ali
1
Nie, plik jest zmienna, i chciałbym, aby wprowadzić ścieżkę do pliku (spadek go do terminala), a następnie przejdź do folderu, jest ona w
Azsgy

Odpowiedzi:

10

Wpisz cd $( dirname /path/to/file.end). To cię zabierze /path/to.

Wyjaśnienie:

  • dirnamezwraca pełną ścieżkę do pliku (bez nazwy pliku, którą byś otrzymał basename) - tzn. dirname /etc/apt/apt.conf.d/99update-notifierzwraca/etc/apt/apt.conf.d
  • wyrażenie $(anything)jest zastępowane wynikiem polecenia w nawiasach. Więc cd $( dirname /etc/apt/apt.conf.d/99update-notifier)jest wykonywany jakocd /etc/apt/apt.conf.d

Innym (ale starym i zniechęconym) zapisem tego samego było

cd `dirname /path/to/file.end` 
guntbert
źródło
8

Nie możesz przejść cddo pliku. Oto funkcja (linia poleceń) , która automatycznie cdprzechodzi do ścieżki dla danej w pełni kwalifikowanej ścieżki pliku:

function fcd () { [ -f "$1" ] && { cd "$(dirname "$1")"; } || { cd "$1"; } ; pwd; }
Rinzwind
źródło
Czy dobrze to zrozumiałem ?: function fcd () {[-f $ 1] && {cd $ (/ file.end $ 1); } || {cd 1 USD; } pwd} odpowiedź brzmi: bash: błąd składniowy w pobliżu nieoczekiwanego tokena `pwd 'daje mi błąd w ten sposób :(
Azsgy,
2
@Atsch, potrzebujesz średnika przed pwd, a jeśli definiujesz funkcję w jednym wierszu, potrzebujesz średnika po pwd.
glenn jackman
@glennjackman funkcja po prostu wychodzi bez żadnego wyjścia lub zmiany
katalogu
uruchom funkcję, a następnie wprowadź echo $?- jaki jest status wyjścia?
glenn jackman
do diabła, nie powinienem był w to wątpić. Alternatywa wyglądała dla mnie lepiej, kiedy ją znalazłem _O-
Rinzwind
1

Jeśli dodasz „/ ..” do nazwy pliku, która przeniesie Cię do właściwego katalogu, np cd /path/to/file.end/... W każdym razie działa na Cygwin.

mózg
źródło
4
Nie działa w bash;) touch test && cd /home/test/test/..mówibash: cd: /home/test/test/..: No such file or directory
Rinzwind