我正在尝试删除语料库目录中的一半文件,以使我的垃圾邮件过滤器受到更快的培训,并在将来节省一些空间。通常我会通过反复试验来做,但由于这些文件需要一段时间才能下载等,加上它的shell(我显然 不是专家),我不想搞砸了
我会尝试这样的事情:
ls *.* > list
for i in 'cat list'; do rm -f i++; done
但我非常确定i++
这样不是跳过列表中每一项的正确方法。 也许我应该使用其他一些循环?
其次,该目录中有两种类型的文件:
我想删除第一种类型的一半和第二种类型的一半。因为它们可能在列表中以标准方式排序,意味着从0000. *到0250. *它们交织,然后在0.250之后。*第一种类型仅保留,它可能以错误的方式删除(全部来自第二种类型)可以删除)。
恕我直言,我应该这样做:
Both types delete 0000.*
Both types skip 0001.*
Both types delete 0002.*
etc.
你们是否知道如何删除上述文件?
答案 0 :(得分:3)
如果您只想删除每个第二个文件,那么您可以使用简单的交替状态机。由于*.*
将按排序顺序为您提供文件,因此您可以删除每个第二个文件,例如:
del=1
for fspec in *.* ; do
if [[ ${del} -eq 1 ]] ; then
del=0
echo rm ${fspec}
else
echo ok ${fspec}
del=1
fi
done
如果您运行该脚本,您将获得一系列交替的行:
rm file1
ok file2
rm file3
ok file4
等等。
如果您对此行为感到满意,则可以完全注释掉ok
行,并从echo
行中删除rm
。
但是,如果您的目的是要实际删除NNNN.*
格式的所有文件,其中NNNN
位于集{0000, 0002, 0004, ..., 9998}
中,则可以更简洁地完成(同样,删除当你开心的时候echo
:
for id in {0000..9998..2} ; do
echo rm -f ${id}.*
done
假设您有一个足够的0000
,bash
将确保字符串长度为四位数。如果没有,您可以使用:
for id in {0..9998..2} ; do
echo rm -f $(printf "%04d" ${id}).*
done
无论您选择何种方法,我都会在测试之前备份您正在使用的目录。