【问题标题】:How to check if a file has an extension (any extension) with regular expression in Bash?如何在 Bash 中检查文件是否具有带有正则表达式的扩展名(任何扩展名)?
【发布时间】:2020-04-25 02:09:20
【问题描述】:

我是使用 Ubuntu18.04 的 Bash 脚本的新手,并试图查找文件是否具有扩展名(任何扩展名),但我尝试实现的正则表达式不起作用。我一直在 Perl 脚本中使用相同的正则表达式,它工作正常。但它在 Bash 脚本中不起作用。 以下是我的 Bash 代码:

dir="ImageFolder"
fileName=""
for f in "$dir"/*;
do
    fileName="$(basename "$f")"

if [[ $fileName =~ /(.*)?\.(.*)/ ]]
then
    echo $fileName
    echo "Yes it has extension"
fi
done

即使“ImageFolder”中的文件具有扩展名,它也不会执行这些回显命令。换句话说,“if”语句没有执行。只有当我通过在'$fileName' 之前放置'!' 符号来反转条件时才会执行它。 当我反转条件时:if [[ ! $fileName =~ /(.*)?\.(.*)/ ]] 然后它执行但给出了不希望的输出(请参见图片): It displays files with extension and says yes it has extension

但是,当我通过物理进入文件夹实际删除文件扩展名时,它再次执行并说文件扩展名存在(请参见图片) Says 'Yes It has extensions even though I've removed them'

我真的需要这个正则表达式才能工作。一些帮助将不胜感激。

【问题讨论】:

  • 一个非常简单的解决方案(虽然没有很多误报)是[[ $filename = *.* ]],使用模式匹配而不是正则表达式。
  • (对不起,我的意思是说 with 误报,例如.bashrcfoo.。)

标签: linux bash shell sh ubuntu-18.04


【解决方案1】:

删除正则表达式模式周围的“/”后它应该可以工作。

[[ $fileName =~ (.*)?\.(.*) ]]

参考。 https://www.tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF 了解更多示例。

【讨论】:

  • 哇!它确实奏效了。我试图支持您的回答,但我的声誉低于 15,因此,它没有得到公开反映。无论如何,感谢您的回答和参考。我衷心感谢。
  • @fpmurphy 不,不会,不在双方括号内。
  • 这需要一些调整来处理一些极端情况。您可能不想考虑像.bashrc 这样的文件有扩展名,并且不清楚如何处理以. 结尾的文件名。 foo. 有扩展名吗? foo.bar.?
  • 嗨@chepner,前面提到的正则表达式将始终指向最后一个点之后的单词。我运行了你的想法,你是对的。如果您有任何其他正则表达式,那么您也可以提及。很高兴知道。谢谢!!
  • 另一种极端情况:您想匹配任何带有扩展名的隐藏文件吗? (例如,像.tmp.txt.swp 这样的 Vim 交换文件)
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多