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

Bil*_*ean 14 rm files

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

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt
Run Code Online (Sandbox Code Playgroud)

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

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

有没有另一种方法可以做到这一点?

αғs*_*нιη 50

您不需要循环或额外的命令Bash Shell Brace Expansion

rm -f rho_{0..200000..5000}.txt
Run Code Online (Sandbox Code Playgroud)

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


Ps 为确保安全并检查哪些文件将被删除,请先进行测试:

ls -1 rho_{0..200000..5000}.txt
Run Code Online (Sandbox Code Playgroud)


And*_*ton 14

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

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done
Run Code Online (Sandbox Code Playgroud)

我包括了在删除之前进行提示的-i选项,rm以便您可以验证行为。一旦您确信它正在做您想做的事情,您就可以省略该选项。

编辑:或者,你可以这样做:

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

如果您做过任何编程,那么这种形式可能会更熟悉。


M4r*_*rty 12

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

为此,您应该使用 xarg :

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 
Run Code Online (Sandbox Code Playgroud)

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

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
Run Code Online (Sandbox Code Playgroud)


Nat*_*dge 9

如果我错了,有人纠正我,但是如果所有以开头的文件rho_都是这种形式,那不就相当于做

rm rho_0.txt rho_*[05]000.txt
Run Code Online (Sandbox Code Playgroud)

因为一个数字(除了 0)是 5000 的倍数当且仅当它以 0000 或 5000 结尾。

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

当然,只有当rho_*.txt您目录中的所有文件都具有所需的格式时才应该使用它。如果您的目录还包含rho_please_dont_delete_me_5000.txt.

(数学说明:这正是因为 5000 的所有质因数,即 2 和 5,也是我们正在研究的基数 10 的质因数。等效地,有一个足够大的 10(即 10000)的幂,它是可以被 5000 整除。没有类似的技巧可以匹配所有 3000 的倍数。)