0

我正在尝试编写一个 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 脚本中执行此操作。在其他编程语言中,我们可以在单个空格字符上使用正则表达式拆分字符串,然后从结果列表中选择第一项。

请您帮忙。

4

4 回答 4

1

尝试这个 :

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

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

使用printfand head(不允许使用换行符的文件名,但很少见)

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

使用

printf -- '%s\n' *.txt | sed -n '1p'
于 2013-03-19T08:24:18.920 回答
0

用于head获取第一条输出线:

ls *.txt | head -n 1

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

于 2013-03-19T08:25:15.467 回答
0

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

将文件存储在数组中并选择第一个元素,如下所示:

arr=( *.txt )
echo "${arr[0]}"
于 2013-03-19T08:27:51.373 回答
0

awk 有split功能,非常强大。

awk 'BEGIN{split ("file1 file2 file3", files, " "); print files[1]}'
于 2013-03-19T08:31:36.687 回答