【问题标题】:Bash: Listing all file with .addr_book without file extensionsBash:列出所有带有 .addr_book 的文件,没有文件扩展名
【发布时间】:2014-05-12 05:28:03
【问题描述】:

我希望列出当前目录中所有文件扩展名为“.addr_book”的文件,但扩展名不可见。

我使用了ls | sed -e 's/\..*$//',但这会显示当前目录中的所有文件。有没有办法让它只显示 .addr_book 文件。

谢谢。

【问题讨论】:

    标签: bash shell unix sed ls


    【解决方案1】:

    我会推荐这种我经常使用的非常简单的方法:

    (选项 -C1 仅将 ls 输出格式化为一列,这是文件名)

    ls -C1 *.addr_book | awk -F。 '{ 打印 $1 }'

    希望这会有所帮助!

    丹尼尔。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      ls | awk -F"\.addr_book" 'NF>1 {print $1}'
      

      这将使用.addr_book作为分隔符来划分所有文件名。
      如果数字字段大于1,则打印第一部分。

      【讨论】:

      • 嗨,Jotne,. 前面应该有一个反斜杠,并且(理论上,可能不是在实践中)像 a.addr_book.2nd.title.addr_book 这样的文件可能存在问题,例如……问候。 ..
      • @Scrutinizer 谢谢,已修复。
      • @chepner 有趣的阅读,但它非常假设。您多久在文件名中看到换行符;)我猜 99.99% 在文件名中使用普通字符。
      • 我认为没有理由提出一种可能突破不会的方法。
      【解决方案3】:

      试试:

      for f in *.addr_book; do 
        [ -e "$f" ] && printf "%s\n" "${f%.*}"
      done
      

      [ -e "$f" ] 用于不存在 *.addr_book 文件的情况下,否则会出现错误结果..

      【讨论】:

      • 这个或shopt -s nullglob
      【解决方案4】:
      for file in *.addr_book; do
          echo "${file%.addr_book}" # removes the trailing '.addr_book' from $file
      done
      

      【讨论】:

      • 另一个使用GNU parallel的解决方案:parallel echo {.} ::: *.addr_book
      【解决方案5】:

      你可以使用basename:

      for i in *.addr_book; do
        basename "$i" .addr_book
      done
      

      来自man basename

         basename NAME [SUFFIX]
         ...
         Print  NAME  with  any leading directory components removed.  If speci‐
         fied, also remove a trailing SUFFIX.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-24
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2020-09-27
        • 1970-01-01
        相关资源
        最近更新 更多