Bash删除目录

时间:2015-09-16 07:50:28

标签: bash

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

我会尝试这样的事情:

ls *.* > list
for i in 'cat list'; do rm -f i++; done

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

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

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

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

    Both types delete 0000.*
    Both types skip 0001.*
    Both types delete 0002.*
    etc.
    

    你们是否知道如何删除上述文件?

1 个答案:

答案 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

假设您有一个足够的0000bash将确保字符串长度为四位数。如果没有,您可以使用:

for id in {0..9998..2} ; do
    echo rm -f $(printf "%04d" ${id}).*
done

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