【问题标题】:How to list all the files matching criteria and select first file using shell script?如何列出所有符合条件的文件并使用 shell 脚本选择第一个文件?
【发布时间】:2013-03-19 08:22:03
【问题描述】:

我正在尝试编写一个 shell 脚本来

  1. 列出所有符合某些条件的文件,例如“具有 .txt 扩展名的文件”,然后
  2. 从该列表中选择第一个文件

我已经设法列出了所有具有 .txt 扩展名的文件,使用 ls *.txt 命令将其保存在变量中。我的 shell 脚本如下所示

#!/bin/bash

all_text_files=`ls *.txt`
echo $all_text_files

在我的系统上,我得到以下输出

sample_text_file_1.txt sample_text_file_2.txt sample_text_file_3.txt sample_text_file_4.txt sample_text_file_53.txt

如您所见,所有文件都由单个空格分隔。现在我想选择第一个文件,即sample_text_file_1.txt 文件,然后读取该文件。

由于我对 shell 脚本编程完全陌生,我不知道如何在 shell 脚本中执行此操作。在其他编程语言中,我们可以在单个空格字符上使用正则表达式拆分字符串,然后从结果列表中选择第一项。

请求您帮忙。

【问题讨论】:

    标签: regex shell


    【解决方案1】:

    试试这个:

    使用 数组,不使用管道,仅使用bash 内置:

    array=( *.txt )
    echo "${arrray[0]}"
    

    使用printfhead(不允许使用带有换行符的文件名,但这种情况很少见)

    printf -- '%s\n' *.txt | head -n 1
    

    使用

    printf -- '%s\n' *.txt | sed -n '1p'
    

    【讨论】:

    • -1,您的printf 答案并不可靠,因为它不处理包含换行符的文件名。
    【解决方案2】:

    解析ls的输出是not safe,所以不要这样做。

    将文件存储在一个数组中,然后像这样选择第一个元素:

    arr=( *.txt )
    echo "${arr[0]}"
    

    【讨论】:

    • 正是我之前所说的
    • 当我检查你的答案时你还没有说出来。显然你更新了它。
    • 如果您在 5 分钟内编辑它,它不会显示在修订历史记录中。我不是新手。
    • 下次在说错误假设之前刷新你的浏览器
    • 我不会再和你争论了。我看到您已经编辑了您的答案并将我的解决方案放在了它的顶部。我也标记了你的评论。
    【解决方案3】:

    Awk 有split 函数,非常强大。

    awk 'BEGIN{split ("file1 file2 file3", files, " "); print files[1]}'
    

    【讨论】:

      【解决方案4】:

      使用head取第一行输出:

      ls *.txt | head -n 1
      

      但是,您不应该使用 ls 并解析其输出,除非您有特定的理由这样做(例如,您想按某些标准对文件进行排序并采用第一个标准)。

      【讨论】:

      • @sputnick,同意。如果“first”是根据ls(按时间、大小等排序)定义的,则使用 ls 是有意义的。
      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多