Bash 删除目录中的一半文件

Jam*_*ond 4 bash

我正在尝试删除语料库目录中的一半文件,以使我的垃圾邮件过滤器训练得更快一点,并在将来节省一些空间。通常我会通过反复试验来完成,但由于这些文件需要一段时间才能下载等,再加上它的外壳(我显然不是专家),我不想把它搞砸。

我会尝试这样的事情:

ls *.* > list
for i in 'cat list'; do rm -f i++; done
Run Code Online (Sandbox Code Playgroud)

但我很确定i++这不是跳过列表中每第二个项目的正确方法。也许我应该使用其他一些循环?

其次,该目录中有两种类型的文件:

  1. 0000.* 到 1500.*
  2. 0000.* 到 0250.*

我想删除第一种类型的一半和第二种类型的一半。由于它们可能在列表中以标准方式排序,这意味着从 0000.* 到 0250.* 它们交织,然后在 0.250.* 之后仅保留第一种类型,因此可能会以错误的方式删除(全部来自第二种类型可以删除)。

所以恕我直言,我应该这样做:

Both types delete 0000.*
Both types skip 0001.*
Both types delete 0002.*
etc.
Run Code Online (Sandbox Code Playgroud)

你们知道如何删除上面的这些文件吗?

pax*_*blo 5

如果您只想删除每隔一个文件,那么您可以使用简单的交替状态机。由于*.*将按排序顺序为您提供文件,因此您可以每隔一个文件删除一次,例如:

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)

无论您选择哪种方法,我都会在测试之前备份您正在使用的目录。