我有一个包含名称文件的目录
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
。
还有另一种方法吗?
ls
。
我有一个包含名称文件的目录
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
。
还有另一种方法吗?
ls
。
Answers:
您不需要循环或多余的命令Bash Shell Brace Expansion
。
rm -f rho_{0..200000..5000}.txt
说明:{start..end..step}
。该-f
忽略对不存在的文件提示。
Ps为了安全起见并检查哪些文件将被删除,请首先进行以下测试:
ls -1 rho_{0..200000..5000}.txt
您不能像管道的内容是参数一样通过管道传输到程序。它是通过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
选项,则可以使用该选项,而不是通过printf
and命令替换使用此替代方法。
如果我写错了,请有人纠正我,但是如果所有开头的文件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的倍数。)