如何在 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
将 210
和 230
作为参数传递给它,它不起作用。
我做错了什么?
问题不在于 运行 命令行或脚本中的命令。您可以通过 运行 命令行中的以下命令自行检查:
$ 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>
扩展到 210
和 230
时,要这样解释范围已经太晚了; { .. }
部分只是保留下来,没有任何特殊含义。
无论如何,在这里使用 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
我在一个文件夹中有几个文件,名称如下:
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
将 210
和 230
作为参数传递给它,它不起作用。
我做错了什么?
问题不在于 运行 命令行或脚本中的命令。您可以通过 运行 命令行中的以下命令自行检查:
$ 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>
扩展到 210
和 230
时,要这样解释范围已经太晚了; { .. }
部分只是保留下来,没有任何特殊含义。
无论如何,在这里使用 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