我在目录中有一组文件,编号如下:
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