我有一个包含名称文件的目录
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)
如果我错了,有人纠正我,但是如果所有以开头的文件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 的倍数。)