我有一个目录,其中包含具有名称的文件
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
。
还有其他方法可以做到这一点吗?
答案1
您不需要循环或额外的命令Bash Shell Brace Expansion
。
rm -f rho_{0..200000..5000}.txt
解释: {start..end..step}
。-f
忽略不存在文件的提示。
Ps 为了保证安全并检查哪些文件将被删除,请先进行测试:
ls -1 rho_{0..200000..5000}.txt
答案2
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
如果您做过任何编程,那么该表单可能会更熟悉。
答案3
您不能像管道的内容是参数一样通过管道连接到程序。它是通过标准输入发送的。
您应该使用 xarg 来达到此目的:
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm
但首先你可以尝试使用 echo 来看看一切是否都如你所愿:
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
答案4
如果我错了,有人纠正我,但是如果所有以 开头的文件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 的倍数。)