列出在特定范围内编号的文件

mil*_*man 16 bash range

我在目录中有一组文件,编号如下:

file1.txt
file2.txt
...
file30.txt
...
Run Code Online (Sandbox Code Playgroud)

现在,我想对特定范围的文件运行命令,比如 18 到 31。

到目前为止,我已经使用了以下方法,

三个论点

command file1[8-9].txt file2[0-9].txt file3[0-1].txt
Run Code Online (Sandbox Code Playgroud)

现在假设我想要所有其他数字,

环形

for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command
Run Code Online (Sandbox Code Playgroud)

这似乎是一个更可靠的循环(空格有效)

for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command
Run Code Online (Sandbox Code Playgroud)

但似乎应该有一种更简单的方法来做到这一点。我猜最好的解决方案是创建一个 bash 函数,它将文件集返回到命令行。然后我可以做类似的事情,

command `filerange file 18 31`
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法或建议来有效地做到这一点?

如果我错过了在网络或superuser.

Den*_*son 28

尝试这个:

for file in file{18..31}.txt
Run Code Online (Sandbox Code Playgroud)

它被称为“序列表达式”,它是 Bash大括号扩展功能的一部分。它适用于 Bash 3 和 4。

增量功能是 Bash 4 的新功能。您可能有 Bash 3.x。

在 Bash 4 中,您可以执行以下操作:

$ for i in {1..6..2}; do echo $i; done
1
3
5
Run Code Online (Sandbox Code Playgroud)

但是在 Bash 3 中,您必须这样做才能获得相同的结果:

$ for ((i=1; i<=6; i+=2)); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

相同的形式加一:

$ for ((i=1; i<=6; i++)); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

任何数字都可以是变量或表达式。但是,在序列表达式中,数字必须是常量

这是在您的文件中使用该表单的示例:

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done
Run Code Online (Sandbox Code Playgroud)

Bash 4 中序列表达式的另一个新特性是能够包含前导零。如果您想创建(和使用)可以正确排序的编号文件,这将非常有用。

在 Bash 4 中:

touch file{001..010}.txt
Run Code Online (Sandbox Code Playgroud)

将通过“file010.txt”创建名为“file001.txt”的文件。他们的名字将按照预期的顺序排序。如果没有前导零,“file10.txt”将排在“file1.txt”之前。

要处理这些文件,您可以使用相同的前导零语法:

for file in file{001..010}.txt; do echo "$file"; done
Run Code Online (Sandbox Code Playgroud)

在 Bash 3 中,如果需要前导零,则需要自己填充值:

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done
Run Code Online (Sandbox Code Playgroud)

printf语句将在 i 的值前面加上前导零,因此宽度为 3,例如(“4”变为“004”)。

编辑:

在文件名中容纳空格很简单:

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt
Run Code Online (Sandbox Code Playgroud)