2016-02-26 77 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 

有沒有簡單的方法來做到這一點,而不必使用SED/AWK等?

+0

可能出現[從文件路徑獲取文件目錄路徑](http://stackoverflow.com/quest/6121091/get-file-directory-path-from-filepath) –

+0

嘗試使用'$ {f%/ *}'去除文件名(類似於'dirname'內建)。 (你應該確保在移除之前還有更多的''/''或之後檢查零長度) –

回答

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