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


16

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

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


我更新了我的问题,以包含使用for循环的解决方案,该循环允许使用xargs在文件名中留空格。如果没有bash 4,这似乎可以工作。如果您具有bash 4,则一定要使用大括号扩展! 查看所选答案。 无耻的插件来升级雪豹猛击
milkypostman 2011年

Answers:


25

尝试这个:

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

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

增量功能是Bash 4的新增功能。您可能拥有Bash3.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

相同形式加一:

$ 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

谢谢!我不知道这是我的一生。我无法工作的一件事是,增量似乎在bash的OSX版本中不起作用。即,我无法{1..10..2}在OSX bash中工作。
milkypostman

好吧,这是因为Snow Leopard(出于某种原因)正在使用bash 3.1。这是软件问题。
milkypostman

@milkypostman:{01..10}Bash 4新增了增量功能和前导零。您可能拥有Bash3.x。如果需要增量功能或将变量用于范围边界,请使用以下形式:(for ((i=1; i<=10; i+=2}i++增量一)。任何数字都可以是变量或表达式。然后,要在for循环内使用该值:echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do: printf -vi'%03d'$ i`,它将在值前i加上零,因此宽度为3,例如(“ 4”变为“ 004”)。
丹尼斯·威廉姆森

丹尼斯,您有什么办法更新解决方案以包括替代表格。作为评论,这有点混淆了我应该得到的东西。
milkypostman

@milkypostman:请参阅我编辑的答案。
丹尼斯·威廉姆森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.