2011-03-19 77 views
17

我知道怎麼刪除文件的擴展名,當我知道它:去除文件擴展名不知道它

nameis=$(basename $dataset .csv) 

,但我想刪除任何分機不知道這一點,事前,任何人都知道如何做這個?

任何幫助表示讚賞, 特德

回答

27

在bash,你可以做到以下幾點:

nameis=${dataset%.*} 

...如:

$ dataset=foo.txt 
$ nameis=${dataset%.*} 
$ echo $nameis 
foo 

此語法在bash的手冊頁描述as:

$ {param ETER%字}

$ {參數%%字}

刪除匹配的後綴模式。這個詞被擴展爲產生一個模式,就像路徑名擴展一樣。如果模式與參數擴展值的尾部相匹配,則擴展結果是具有最短匹配模式(「%」情況)或最長匹配模式(「%%」情況)已刪除。如果參數是@或*,則模式刪除操作將依次應用於每個位置參數,並且擴展是結果列表。如果參數是以@或*爲下標的數組變量,則將模式刪除操作依次應用於數組的每個成員,並且擴展是結果列表。

1

${dataset%.*}可能工作;不過,請注意文件沒有擴展名,因爲它會查找不是要刪除的擴展名的一部分。

1

你可以,如果任何最後的點以下除去一切,與sed

nameis=$(echo $filename | sed 's/\.[^.]*$//') 

但是,這不會對文件具有雙擴展名,如.tar.gz工作。

0

我會建議,而不是basename使用sed命令,像這樣:

echo "$fileName" | sed 's/\..*$//g'

+0

將爲故障如果你想讓結果成爲'foo.bar',那麼文件名就是'foo.bar.baz'。 – 2011-03-19 22:50:55

+0

這對我來說非常好,因爲我不希望文件名是'foo',不幸的是當目錄中有一個點時,它就會失敗。 – 2016-09-13 11:35:22

1

nameis = $ {。數據集%% *} 假設你沒有的基本名稱有一個句點。這會從左側返回儘可能長的無點串。現在

5

,如果你想要一些時尚的老學校正則表達式:

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/" 

- >應返回:foo.bar.tar

 
I will break it down: 
s/ Substitute 
^  From the beginning 
\( Mark 
.*  Everything (greedy way) 
\)  Stop Marking (the string marked goes to buffer 1) 
\.  until a "." (which will be the last dot, because of the greedy selection) 
.*  select everything (this is the extension that will be discarded) 
$  until the end 
/ With (substitute) 
\1  The buffer 1 marked above (which is the filename before the last dot(.) 
/ End 

克里斯蒂亞諾薩維諾

+0

感謝您的解釋! – 2015-10-09 12:45:28