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