在 Bash 中获取文件的扩展名 [重复]
Posted
技术标签:
【中文标题】在 Bash 中获取文件的扩展名 [重复]【英文标题】:Get extension of files in Bash [duplicate] 【发布时间】:2017-10-28 06:23:32 【问题描述】:我正在编写一个脚本,它将按扩展名对文件进行排序。我知道一种通过文件名执行此操作的方法。问题是,相同的文件的名称中没有扩展名。例如,如果我有文件:file.txt
,则通过简单的extension="$filename##*."
获取扩展名是没有问题的。但如果文件名只是filename
,则此方法不起作用。是否有任何其他选项可以获取文件扩展名并将其放入 Bash 脚本中的变量中?
【问题讨论】:
Extract filename and extension in Bash的可能重复 【参考方案1】:filename="file.txt"
ext="$filename##*."
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi
输出:
文本文件filename="file"
ext="$filename##*."
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi
输出:
没有扩展【讨论】:
但问题是,这些名称中没有扩展名的文件是 txt 或 jpg 文件,我应该将它们放在正确的文件夹中。【参考方案2】:没有像[[
这样的bashism:
case $filename in
(.*.*) extension=$filename##*.;;
(.*) extension="";;
(*.*) extension=$filename##*.;;
(*) extension="";;
esac
适用于任何 Bourne-heritage shell。
【讨论】:
【参考方案3】:您可以通过删除扩展名来获取文件的基本名称,即从原始文件中删除那个。
base=$filename%.*
ext=$filename#$base.
不过,我更喜欢case
声明;意图更清晰。
【讨论】:
如果没有扩展名,此代码实际上返回 $filename。通过添加另一个步骤,如果没有扩展名,您可以使其返回“”。extension_echo () file=$1; base=$file%.*; ext=$file#$base; ext=$ext#.; echo "$ext";
【参考方案4】:
对于这样的情况:
$ ls file*
file1 file1.txt file2
你可以这样做:
$ ls file* |awk -F. 'print (NF>1?$NF:"no extension")'
no extension
txt
no extension
【讨论】:
【参考方案5】:您似乎只是在询问如何将文件名的文件扩展名放入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
这样,没有扩展名的文件会导致扩展名变量为空。
【讨论】:
谁投反对票:如果你能解释我出了什么问题,我可以查看我的答案。 虽然我没有对你投反对票,但我需要告诉你,你的解决方案很容易出错。只需运行touch "file spaced.txt"
并测试您的代码。此外,谷歌围绕为什么你不应该解析 ls
的输出以及如何使用 for 和 globing(即 for file in *
)循环文件 - 另一个灰点是当 bash 配备参数扩展时使用 sed 可以给你带来所需的结果。就像在月神公园用机关枪赢得泰迪熊一样。此外,并非所有sed
版本都一样。以上是关于在 Bash 中获取文件的扩展名 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Bash,按文件名中的日期获取类似文件名的最后3个文件[重复]