2017-05-27 64 views
1

我正在編寫一個腳本,它將按擴展名對文件進行排序。我知道一個按文件名進行操作的方法。問題是,相同的文件名稱中沒有擴展名。例如,如果我有文件:file.txt,通過簡單的extension="${filename##*.}"獲得擴展名沒有問題。但是,如果文件名只是filename,此方法不起作用。是否有任何其他選項來獲取文件的擴展名並將其放到Bash腳本中的變量中?Bash - 獲取文件的擴展

回答

0

看來你只問如何把一個文件名的文件擴展名到一個變量在bash ,而你並沒有問及分揀部分。 爲此,以下簡短腳本可以從文件列表中打印每個文件的擴展名。

#!/bin/sh 
filesInCurrentDir=`ls` 
for file in $filesInCurrentDir; do 
    extention=`sed 's/^\w\+.//' <<< "$file"` 
    echo "the extention for $file is: "$extention #for debugging 
done 

包含當前分析文件擴展名的變量名爲extention。命令sed 's/^\w\+.//匹配任意長度的字符,直到找到文件名中的第一個點,然後將其刪除。因此,如果存在多個文件擴展名,則這些全部列出(例如,file.txt->獲得延伸txt,但是file.odt.pdf->獲得延伸odt.pdf)。

當前文件夾的內容(可以是文件的任何空間分隔的列表,你喂的循環)以上腳本的

aaab.png 
abra 
anme2.jpg 
cadabra 
file 
file.png 
file.txt 
loacker.png 
myText 
name.pdf 
rusty.jgp 

結果:

the extention of aaab.png is: png 
the extention of abra is: 
the extention of anme2.jpg is: jpg 
the extention of cadabra is: 
the extention of file is: 
the extention of file.png is: png 
the extention of file.txt is: txt 
the extention of loacker.png is: png 
the extention of myText is: 
the extention of name.pdf is: pdf 
the extention of rusty.jgp is: jgp 

在這樣,沒有擴展名的文件將導致擴展變量爲空。

+0

誰downvotes:如果你能解釋我什麼是錯的,我可以檢討我的答案。 – FedericoCapaldo

+1

雖然我還沒有投票給你,我需要告訴你,你的解決方案很容易中斷。只需運行'touch「文件spaced.txt」'並測試你的代碼。此外谷歌周圍你爲什麼不應該解析'ls'的輸出以及如何在for和globing文件中循環(例如'for file in *') - 另一個灰點是當bash配備參數擴展時使用sed可以爲您帶來所需的結果。就像在盧娜公園使用機槍來贏得泰迪熊。而且不是所有的'sed'版本都是一樣的。 –

1
filename="file.txt" 
ext="${filename##*.}" 
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi 

輸出:

 
txt 

filename="file" 
ext="${filename##*.}" 
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi 

輸出:

 
no extension 
+0

但問題是,名稱中沒有擴展名的這些文件是例如txt或jpg文件,我應該將它們放到正確的文件夾中。 – Sigger

3

沒有bash化等[[

case $filename in 
    (*.*) extension=${filename##*.};; 
    (*) extension="";; 
esac 

適用於任何伯恩遺產貝殼。

2

您可以通過去除擴展獲取文件的基本名稱,刪除從原來的。

base=${filename%.*} 
ext=${filename#$base.} 

雖然我更喜歡case聲明;意圖更清晰。

1

對於情況,如:

$ ls file* 
file1 file1.txt file2 

你可以這樣做:

$ ls file* |awk -F. '{print (NF>1?$NF:"no extension")}' 
no extension 
txt 
no extension