根据文件名从终端删除特定文件


13

我有一个包含名称文件的目录

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

等等。我想删除所有5000的倍数。

我尝试了以下方法:printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rm,但这给了我回应rm: missing operand

还有另一种方法吗?


6
无论您如何执行此操作,为了安全起见,我建议将所需文件移到目录中,然后在确认所有要删除的文件都在目录中后,删除目录。
user117529 '17

安全在这里很重要。我通常首先测试这些东西ls
苏格兰,

Answers:


49

您不需要循环或多余的命令Bash Shell Brace Expansion

rm -f rho_{0..200000..5000}.txt

说明{start..end..step}。该-f忽略对不存在的文件提示。


Ps为了安全起见并检查哪些文件将被删除,请首先进行以​​下测试:

ls -1 rho_{0..200000..5000}.txt

13

rm不从标准输入中读取。您可以这样做:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

我提供了删除前提示的-i选项,rm以便您可以验证行为。一旦确定它正在做什么,就可以忽略该选项。

编辑:或者,您可以执行以下操作:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

如果您已完成任何编程,则该表格可能会更熟悉。


12

您不能像管道的内容是参数一样通过管道传输到程序。它是通过stdin发送的。

您应该为此目的使用xarg:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

但首先,您可以尝试使用echo看看是否一切都如您所愿:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo

如果您的版本seq具有-f/ --format选项,则可以使用该选项,而不是通过printfand命令替换使用此替代方法。
大卫·佛斯特

谢谢,我刚刚使用问题中使用的命令来回答,并试图解释他的rm错误
M4rty

9

如果我写错了,请有人纠正我,但是如果所有开头的文件rho_都具有这种格式,那是否等同于

rm rho_0.txt rho_*[05]000.txt

由于数字(非0)是且仅当以0000或5000结尾时才是5000的倍数。

(0是一种特殊情况,因为它是5000的倍数,但是通常在写入时没有附加的前导零。如果您不打算包含0,则从上一行中取出它。)

当然,只有rho_*.txt在目录中的所有文件都具有所需格式的情况下,才应使用此选项。如果您的目录中也包含,请不要使用它rho_please_dont_delete_me_5000.txt

(数学注释:之所以如此有效,是因为所有5000的素数,即2和5,也是我们正在使用的基数10的素数。等效地,有足够大的10的幂(即10000),即可被5000整除。没有类似的技巧可以匹配所有3000的倍数。)


这实际上是最好的答案。
cesarv
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.