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

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

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

file1.txt
file2.txt
...
file30.txt
...

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

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

三个论点

command file1[8-9].txt file2[0-9].txt file3[0-1].txt

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

环形

for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command

这似乎是一个更可靠的循环(空格起作用)

for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command

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

command `filerange file 18 31`

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

如果我错过了在网络上或其他地方对这一问题的解答,我提前表示歉意superuser

答案1

尝试这个:

for file in file{18..31}.txt

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

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

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

$ for i in {1..6..2}; do echo $i; done
1
3
5

但在 Bash 3 中,您必须执行以下操作才能获得相同的结果:

$ for ((i=1; i<=6; i+=2)); do echo $i; done

相同形式,每次增加 1:

$ for ((i=1; i<=6; i++)); do echo $i; done

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

以下是在您的文件上使用该表单的示例:

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

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

在 Bash 4 中:

touch file{001..010}.txt

将创建名为“file001.txt”至“file010.txt”的文件。其名称将按预期顺序排序。如果没有前导零,“file10.txt”将排在“file1.txt”之前。

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

for file in file{001..010}.txt; do echo "$file"; done

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

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

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

答案2

还可以嵌套内容,例如已轮换的日志文件文件夹,其中有一个纯文本文件 ( .log)、另一个纯文本文件.log.1和后续的 gzip 文件 ( .log.n.gz)。这将列出前 20 个:

user@host logs$ ls -la access.log{,.1,.{2..20}.gz}
-rw-r--r--  1 user  staff  4995098 30 Jan 21:18 access.log
-rw-r--r--  1 user  staff  4337943 30 Jan 21:18 access.log.1
-rw-r--r--  1 user  staff  4360603 20 Jan 21:19 access.log.10.gz
-rw-r--r--  1 user  staff  3168078 19 Jan 21:19 access.log.11.gz
-rw-r--r--  1 user  staff  1060425 18 Jan 21:19 access.log.12.gz
-rw-r--r--  1 user  staff  4368664 17 Jan 21:19 access.log.13.gz
-rw-r--r--  1 user  staff  3410695 16 Jan 21:19 access.log.14.gz
-rw-r--r--  1 user  staff  3422692 15 Jan 21:19 access.log.15.gz
-rw-r--r--  1 user  staff  2505676 14 Jan 21:19 access.log.16.gz
-rw-r--r--  1 user  staff  1322932 13 Jan 21:19 access.log.17.gz
-rw-r--r--  1 user  staff  1354940 12 Jan 21:19 access.log.18.gz
-rw-r--r--  1 user  staff  2532294 11 Jan 21:19 access.log.19.gz
-rw-r--r--  1 user  staff  1476880 28 Jan 21:19 access.log.2.gz
-rw-r--r--  1 user  staff  3011422 10 Jan 21:19 access.log.20.gz
-rw-r--r--  1 user  staff  1659280 27 Jan 21:19 access.log.3.gz
-rw-r--r--  1 user  staff  3482272 26 Jan 21:19 access.log.4.gz
-rw-r--r--  1 user  staff  3336843 25 Jan 21:19 access.log.5.gz
-rw-r--r--  1 user  staff  2952699 24 Jan 21:19 access.log.6.gz
-rw-r--r--  1 user  staff  1220768 23 Jan 21:19 access.log.7.gz
-rw-r--r--  1 user  staff  3788769 22 Jan 21:19 access.log.8.gz
-rw-r--r--  1 user  staff  3706914 21 Jan 21:19 access.log.9.gz

相关内容