【问题标题】:Get extension of files in Bash [duplicate]在 Bash 中获取文件的扩展名 [重复]
【发布时间】:2017-10-28 06:23:32
【问题描述】:

我正在编写一个脚本,它将按扩展名对文件进行排序。我知道一种通过文件名执行此操作的方法。问题是,相同的文件的名称中没有扩展名。例如,如果我有文件:file.txt,则通过简单的extension="${filename##*.}" 获取扩展名是没有问题的。但如果文件名只是filename,则此方法不起作用。是否有任何其他选项可以获取文件扩展名并将其放入 Bash 脚本中的变量中?

【问题讨论】:

标签: string bash filenames


【解决方案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 -> 获取扩展名txtfile.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 版本都一样。
      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 2012-09-12
      • 1970-01-01
      • 2015-02-14
      • 2023-04-07
      • 2011-02-09
      • 2013-10-07
      • 1970-01-01
      相关资源
      最近更新 更多