2017-05-27 80 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