2012-12-07 43 views
28

我有一個包含相對路徑的文件,每行一個路徑,即是這樣的一個文件(比如叫list.txt):Ubuntu bash腳本:如何用最後一個斜槓分割路徑?

foo/bar/file1 
foo/bar/baz/file2 
goo/file3 

我需要編寫一次處理一個路徑的bash腳本,將它拆分爲最後一個斜槓,然後啓動另一個將其兩條路徑作爲參數的進程。到目前爲止,我只有循環部分:

for p in `cat list.txt` 
do 
    # split $p like "foo/bar/file1" into "foo/bar/" as part1 and "file1" as part2 
    inner_process.sh $part1 $part2 
done 

如何拆分?當路徑沒有斜槓時,這會在退化情況下工作嗎?

THX

回答

65

使用basenamedirname,這就是你所需要的。

part1=`dirname "$p"` 
part2=`basename "$p"` 
+0

這實際上是「part1 ='dirname $ p' /」,因爲我需要最後一個斜槓,但除此之外它是完美的:-) –

+3

只要文件名包含空格或有趣的符號,就會崩潰。 。':-(' –

+1

這樣的斷裂對於解決co而言是微不足道的urse:'part1 =「$(dirname」$ p「)」'和'part2 =「$(basename」$ p「)」' – zenaan

11

一個適當的100%bash的方式是安全的關於有空格或有趣的符號的文件名(提供inner_process.sh正確處理它們,但這是另一回事):

while read -r p; do 
    [[ "$p" == */* ]] || p="./$p" 
    inner_process.sh "${p%/*}" "${p##*/}" 
done < list.txt 

,它不爲每個文件分配dirnamebasename(在子殼中)。

[[ "$p" == */* ]] || p="./$p"是在這裏,以防萬一$p不包含任何斜線,然後它預先012ph它。

有關%##符號的更多信息,請參閱Bash Reference Manual中的Shell Parameter Expansion部分。

-3

以下是查找和替換xml文件擴展名的一個示例。

for files in $(ls); do 

    filelist=$(echo $files |cut -f 1 -d "."); 
    mv $files $filelist.xml; 
done 
+4

永遠不要分析ls。 [見這裏瞭解爲什麼。](http://mywiki.wooledge.org/ParsingLs) – XZS

2

要回復@ gniourf_gniourf的@ piokuc的回答的批評,同時保持它短而簡單(如果效率不高):

part1=`dirname "$p"` 
part2=`basename "$p"` 

(我會在評論已作出迴應,但是這句法上是不可能的。 )

相關問題