如何在 Bash 脚本中列出一系列文件?

How can I list a range of files in a Bash script?

我在一个文件夹中有几个文件,名称如下:

FILE_201.txt
FILE_206.txt
FILE_215.txt
FILE_223.txt
FILE_229.txt
FILE_232.txt

我想 select 两个值之间的文件(例如“210”和“230”之间)。 从命令行,运行ning

ls -1 FILE_{210..230}.txt

列出所需的文件;没问题。但是,如果我 运行 以下 Bash 脚本,

#!/bin/bash
ls -1 FILE_{..}.txt

210230 作为参数传递给它,它不起作用。

我做错了什么?

问题不在于 运行 命令行或脚本中的命令。您可以通过 运行 命令行中的以下命令自行检查:

$ set 210 230 # assigns variables  and  the values "210" and "230", resp.
$ ls -1 FILE_{..}.txt
ls: FILE_{210..230}.txt: No such file or directory

如您所见,您遇到了与脚本文件引发的错误相同的错误。问题是 大括号扩展发生在 之前 变量扩展 .

在这种情况下,当 </code> 和 <code> 扩展到 210230 时,要这样解释范围已经太晚了; { .. } 部分只是保留下来,没有任何特殊含义。

无论如何,在这里使用 ls 是个坏主意,因为对于范围内与现有文件不匹配的每个文件名,您都会收到错误消息。你最好结合使用 for 循环和 seq,如 this answer:

#!/bin/bash

# test.sh

for n in $(seq  ); do 
    f="FILE_$n.txt"
    if [ -e $f ]; then
        printf $s\n "$f"
    fi
done

示例:

$ touch FILE_209.txt
$ touch FILE_213.txt
$ touch FILE_224.txt
$ touch FILE_232.txt
$ bash test.sh 210 230
FILE_213.txt
FILE_224.txt

如果有人感兴趣,您需要"eval"您的线路。即

eval "ls FILE_{..}.txt