如何“ rm”或“ mv”一系列文件,例如file01.txt,file02.txt…file85.txt


23

假设我有一堆这样命名的文件:

file01.txt file02.txt file03.txt ... file20.txt

我想对一系列这些文件执行命令。

我知道是否要将“ rm”从“ file05.txt”转换为“ file09.txt”,我可以这样做:

rm file0[5-9].txt

但是我怎样才能“ rm”一个从file08.txt到file13.txt的范围?我尝试了这段代码

rm file[08-13].txt

它不起作用。我可以运行以下命令:

rm file0[89].txt file1[0-3].txt

但是我想知道是否可以通过对“ rm”再添加一个更精确的参数来做到这一点。


在这里回答了一个几乎相同的问题: stackoverflow.com/questions/25049411/…–
arielf

Answers:


38

您需要使用括号扩展bash

rm file{08..13}.txt

这会将文件删除file08file13,如果缺少任何文件,则会显示错误消息。

设置范围以满足您的需求。


遍历运算符的问题[]在于它将其中的每个字符/数字视为单个标记,因此仅支持使用单个数字的范围声明。

如果你坚持使用[],你可以用这个比较难看模式匹配file08file13

rm file0[8-9].txt file1[0-3].txt

5
括号扩展在逗号中也很有用,例如mv foo.{txt,md}cp foo.txt{,.bak}
Kos

2

某些shell,例如Ubuntu的默认/bin/shdash)或 mksh没有大括号扩展,或者在情况下ksh-大括号扩展不能使用填充零:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

在这种情况下,我们可以利用printf来格式化文件名的数字部分,并使用while循环来实现类似于c的for循环行为(注意echorm或替换为所需的内容):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

这是相当便携-与工作dashkshmksh,也bash。在和的情况下kshbash我们也可以使用c-style for loop syntax (but not in case ofmksh or破折号):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

请注意,在bash的情况下,printf支持打印到变量,因此我们可以printf -v num "%.2d" "$i"代替使用命令替换。

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.