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

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

我有一个目录,其中包含具有名称的文件

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 的倍数。)

相关内容