2008-09-24 74 views

回答

408

下面是如何在猛砸#和%運營商做到這一點。

$ x="/foo/fizzbuzz.bar" 
$ y=${x%.bar} 
$ echo ${y##*/} 
fizzbuzz 

${x%.bar}也可能是${x%.*}點或${x%%.*}後刪除所有第一點後刪除所有內容。

實施例:

$ x="/foo/fizzbuzz.bar.quux" 
$ y=${x%.*} 
$ echo $y 
/foo/fizzbuzz.bar 
$ y=${x%%.*} 
$ echo $y 
/foo/fizzbuzz 

文檔可以在Bash manual找到。查找${parameter%word}${parameter%%word}尾部匹配部分。

170

看看基本名稱命令:

NAME=`basename /foo/fizzbuzz.bar .bar` 
+6

可能是所有當前提供的解決方案中最簡單的方法...儘管我會使用$(...)而不是反引號。 – 2008-09-24 04:20:25

+6

最簡單但增加了一個依賴項(我承認不是一個巨大的或奇怪的)。它也需要知道後綴。 – 2008-09-24 05:25:21

+0

可以用來從最後刪除任何東西,基本上它只是從結尾刪除一個字符串。 – Smar 2011-08-25 15:43:46

12

純bash的方式:

~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; 
~$ y=${x/\/*\//}; 
~$ echo ${y/.*/}; 
fizzbuzz 

此功能在 「參數擴展」 的人bash的解釋。非bash方式比比皆是:awk,perl,sed等。

編輯:用點工作文件後綴並不需要知道的後綴(擴展名),但工作,在本身點。

3
perl -pe 's/\..*$//;s{^.*/}{}' 
7

基名和目錄名的功能是你追求的:

mystring=/foo/fizzbuzz.bar 
echo basename: $(basename $mystring) 
echo basename + remove .bar: $(basename $mystring .bar) 
echo dirname: $(dirname $mystring) 

具有輸出:

basename: fizzbuzz.bar 
basename + remove .bar: fizzbuzz 
dirname: /foo 
3

使用basename假定您知道文件擴展名是什麼,不是嗎?

我相信各種正則表達式建議不能處理包含多個「。」的文件名。

以下似乎應付雙點。哦,文件名包含一個「/」本身(只是踢)

套用帕斯卡爾:「對不起,這個腳本是那麼長。我沒有時間把它縮短」


    #!/usr/bin/perl 
    $fullname = $ARGV[0]; 
    ($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/; 
    ($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/; 
    print $basename . "\n"; 
2

如果您不能像其他帖子中建議的那樣使用basename,則可以始終使用sed。這是一個醜陋的例子。這不是最大的,但它通過提取想要的字符串並用想要的字符串替換輸入來工作。

echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g' 

這將讓你的輸出

fizzbuzz

0

基名這樣做,刪除路徑。它還會刪除後綴,如果它與文件的後綴相匹配,但您需要知道賦予該命令的後綴。否則,您可以使用mv並找出新名稱應該以其他方式。

2

小心建議的perl解決方案:它會在第一個點後刪除任何東西。

$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}' 
some 

如果你想用Perl去做,這樣工作的:

$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}' 
some.file.with 

但如果你使用bash,用y=${x%.*}(或basename "$x" .ext如果您知道分機)的解決方案要簡單得多。

10

使用基本名我用下面​​來實現這一點:

for file in *; do 
    ext=${file##*.} 
    fname=`basename $file $ext` 

    # Do things with $fname 
done; 

這就要求沒有先驗的文件擴展名的知識,當你有一個具有點中有一個文件名的它的作品甚至是文件名(在前面延期);它確實需要程序basename,但這是GNU coreutils的一部分,所以它應該隨任何發行版一起提供。

28

純bash中,兩個獨立的操作來完成:

  1. 從路徑字符串刪除路徑:

    path=/foo/bar/bim/baz/file.gif 
    
    file=${path##*/} 
    #$file is now 'file.gif' 
    
  2. 刪除從路徑字符串的擴展:

    base=${file%.*} 
    #${base} is now 'file'. 
    
1

將t與第二收視率最高的答案OP級答案得到的文件名不完整的路徑:

$ x="/foo/fizzbuzz.bar.quux" 
$ y=(`basename ${x%%.*}`) 
$ echo $y 
fizzbuzz 
0

信息,你可以在Bash manual發現,在尾部匹配部分尋找${parameter%word}${parameter%%word}