如何在可执行参数中加载超过 10 个具有范围的文件?

vis*_*isc 0 bash shell-script wildcards

我有这个工作命令行表达式:

program --files path_to_mydir/mydata_[0-9].csv

我想离开,[0-100]但这不起作用。

program --files path_to_mydir/mydata_[0-100].csv

另外,奖金问,你怎么称呼[0-10]wrt shell脚本和bash脚本?

谢谢

编辑:虽然类似这个问题不是问 ls

Kus*_*nda 6

[...]是括号表达式。它始终匹配单个字符,因此您不能使用[0-100]它,因为它只会匹配单个01(在 POSIX 语言环境中)

zshshell 中,您可以使用<0-100>数字范围通配模式,但这在bash以下情况下不起作用:

program --files path_to_mydir/mydata_<0-100>.csv
Run Code Online (Sandbox Code Playgroud)

在 中bash,您可以改用大括号扩展:

program --files path_to_mydir/mydata_{0..100}.csv
Run Code Online (Sandbox Code Playgroud)

但是您必须注意这与文件名通配模式之间的区别。大括号扩展,就像上面的那个一样,生成字符串,不管有什么文件名可用,而文件名通配模式匹配现有的名称。这意味着大括号扩展可能会提供不存在的程序文件名。

可以使用[...]0 到 100 之间的数字来匹配文件,但您必须将其设为三种模式,每个数字长度一种:

shopt -s nullglob

program --files \
    path_to_mydir/mydata_[0-9].csv \
    path_to_mydir/mydata_[1-9][0-9].csv \
    path_to_mydir/mydata_[1][0][0].csv
Run Code Online (Sandbox Code Playgroud)

第一个匹配包含数字0到 to9的名字,第二个匹配包含10到 to的名字99,最后一个匹配包含100.

你想匹配零填充的整数:

shopt -s nullglob

program --files \
    path_to_mydir/mydata_[0][0-9][0-9].csv \
    path_to_mydir/mydata_[1][0][0].csv
Run Code Online (Sandbox Code Playgroud)

nullglob在此代码的两个变体中都设置了shell 选项,以确保删除与任何名称不匹配的任何模式,而不是未展开。


用户 fra-san 注意到您可以将上面的括号扩展与强制 shell 触发通配模式匹配的东西结合使用:

shopt -s nullglob
program --files path_to_mydir/[m]ydata_{0..100}.csv
Run Code Online (Sandbox Code Playgroud)

包含[m]在字符串中(匹配字符的模式m)将强制 shell 将大括号扩展创建的每个字符串视为单独的通配符模式。由于我们正在使用nullglob,与现有名称不对应的模式将从参数列表中删除。

请注意,这将生成并扩展 101 个通配符模式,而在此答案中使用通配符的其他方法使用两个或三个模式。