bash:如何返回文件扩展名?

bash:如何返回文件扩展名?

我想编写一个脚本来仅返回输入文件名的扩展名。例如,textfile.txt 应该返回txt.

我是 Linux 和 bash 的新手,我正在尝试学习如何编写基本脚本。谢谢!

答案1

shell,例如 bash,有很多字符串操作特征。其中之一可以让您删除给定模式之前的所有内容:

${VAR##GLOB}

上面的语法从变量中删除所有内容,$VAR直到第一次匹配 glob 为止GLOB。因此,要打印文件的扩展名而不显示文件名,您可以这样做:

$ file="file.txt"
$ echo ${file##*.}
txt

请注意,这也可以处理多个“扩展”:

$ file="file.new.txt"
$ echo ${file##*.}
txt

如果您不想这样做,请改用一个#,这将删除最短的匹配项而不是最长的匹配项:

$ echo ${file#*.}
new.txt

现在,要对目录中的所有文件运行此命令,您可以执行以下操作:

$ ls 
file.avi  file.pdf  file.png  file.txt
$ for file in *; do echo "$file : ${file##*.}"; done
file.avi : avi
file.pdf : pdf
file.png : png
file.txt : txt

而且,为了完整起见,您还可以使用以下命令获取不带扩展名的文件名${file%.*}

$ for file in *; do echo "$file : ${file##*.} : ${file%.*}"; done
file.avi : avi : file
file.pdf : pdf : file
file.png : png : file
file.txt : txt : file

答案2

参数扩展:

$ x="textfile.txt"
$ echo ${x##*.}
txt

${parameter##word}模式删除匹配的最大前缀word(除了文件结尾之外的所有前缀)。

答案3

一个非常简单的 bash 脚本可以完成您想要的操作,如下所示:

#!/usr/bin/env bash

echo "$1" | awk -F '.' '{print $NF}'

该脚本被调用为script.sh test.txt,它的作用是

  • 它打印$1到标准输出。$1是赋予脚本的第一个参数,在本例中为test.txt

  • 的 stdout 输出echo通过管道传输到 stdin,awk其中分割字符串 ( test.txt) .,然后打印分割的最后一个元素(txt在本例中)。

只是一个小评论,这可以用一句话来完成,因为这是一项非常简单的任务:

echo test.txt | awk -F '.' '{print $NF}'

答案4

为此,需要考虑几个注意事项:

  • foo.d/bar文件没有扩展名,它不是foo.d/bar扩展名的文件。
  • 您可能还需要考虑.bashrc没有扩展名
  • .和特殊目录文件..可能应该被特殊对待并被认为没有任何扩展名。
  • 扩展名是做什么用的file.tar.gzgz或者tar.gzholiday.picture.jpg或呢bash-4.4
  • 你应该返回什么foo.d/?空还是d

在这里,我会这样做:

#! /bin/sh -
for file do
  case ${file##*/} in
    (?*.*) ext=${file##*.};;
    (*) ext=;;
  esac
  printf '%s\n' "$ext"
done

相关内容