2016-02-26 6 views
0

Я пытаюсь вывести части пути к файлу, но удаляю имя файла и некоторые уровни пути.bash отображает части переменной, которая содержит путь

В настоящее время у меня цикл for делает много вещей, но я создаю переменную из полного пути к файлу и хотел бы удалить некоторые биты.

Например

for f in (find /path/to/my/file - name *.ext) 

даст мне

$f = /path/to/my/file/filename.ext 

То, что я хочу сделать, это Printf/эхом некоторые из этих переменных. Я знаю, что я могу сделать:

printf ${f#/path/to/} 
my/file/filename.ext 

Но я хотел бы, чтобы удалить имя файла и в конечном итоге с:

my/file 

Есть ли простой способ сделать это без использования СЭД/AWK и т.д.?

+0

Возможный дубликат [Получить путь к файловому каталогу из пути к файлу] (http://stackoverflow.com/quest ion/6121091/get-file-directory-path-from-filepath) –

+0

Попробуйте '$ {f%/*}' удалить только имя файла (аналогично встроенному 'dirname'). (Вы должны убедиться, что перед удалением осталось больше 1 '/' или после этого установите нулевую длину) –

ответ

1

Когда вы знаете, какой уровень вашего пути вы хотите, вы можете использовать вырезать:

echo "/path/to/my/filename/filename.ext" | cut -d/ -f4-5 

Если вы хотите, последние два уровня пути, вы можете использовать sed:

echo "/path/to/my/file/filename.ext" | sed 's#.*/\([^/]*/[^/]*\)/[^/]*$#\1#' 

Объяснение:

s/from/to/ and s#from#to# are equivalent, but will help when from or to has slashes. 
s/xx\(remember_me\)yy/\1/ will replace "xxremember_meyy" by "remember_me" 
s/\(r1\) and \(r2\)/==\2==\1==/ will replace "r1 and r2" by "==r2==r1==" 
.* is the longest match with any characters 
[^/]* is the longest match without a slash 
$ is end of the string for a complete match 
Смежные вопросы