Отримайте батьківський каталог для файлу


24

Я хочу отримати лише ім’я батьківського каталогу для файлу.

Приклад: Коли я маю path=/a/b/c/d/file, я хочу лише, dа не /a/b/c/d(що я отримую dirname $path) як вихід.

Чи є якийсь складний спосіб зробити це?

Відповіді:


26

Це звучить , як ви хочете , щоб базове ім'я з на імені папки:

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

чому я отримую. замість батьківського каталогу на debian?
Амір

@Amir: Ви починаєте з повного шляху чи просто імені файлу? Якщо це лише ім'я файлу, dirnameкоманда припускає, що воно знаходиться в поточному каталозі (aka ".").
Гордон Девіссон

добре, я користуюсь цим:parentname="$(basename "$(dirname "$pwd")")"
Амір

1
@Amir: Змінні оболонки залежать від регістру та PWDмають бути використані великими літерами. Спробуйте parentname="$(basename "$(dirname "$PWD")")".
Гордон Девіссон

5

Ви можете використовувати pwd для отримання поточного робочого каталогу та використовувати розширення параметрів, щоб уникнути перекидання його в іншу (під) оболонку.

echo ${PWD##*/}

Редагувати: перевірене джерело


Питання не має нічого спільного з поточним каталогом. Ви можете використовувати${path##*/}
Маттео

2

Я думаю, що це менш ресурсне рішення:

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

edit: На жаль, вкладене розширення неможливо в bash, але воно працює в zsh. Баш-версія:

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

Є деякі крайові випадки, коли це не вдається добре, головним чином, коли немає повного багаторівневого шляху. Наприклад, спробуйте його filepath=fileабо filepath = / file`.
Гордон Девіссон

Справді. Але що таке батьківський каталог foofile? Якщо це не повний шлях, я не можу знати (можливо, якщо foofileіснуючий файл не є лише "рядком").
uzsolt

1

У bash, в одному рядку:

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

2
Чи можете ви, будь ласка, розробити відповідні процедури? це може допомогти майбутнім читачам. також, будь ласка, намагайтеся не писати відповіді на 1/2 рядка.
Лоренцо Фон Маттерхорн

0

Мені подобається відповідь Julian67 вище найкращого, але ось трохи розширена версія:

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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.