gpt4 book ai didi

Bash 删除目录中的一半文件

转载 作者:行者123 更新时间:2023-12-04 02:18:35 24 4
gpt4 key购买 nike

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

我会尝试这样的事情:

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

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

其次,该目录中有两种类型的文件:
  • 0000.* 到 1500.*
  • 0000.* 到 0250.*

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

    所以恕我直言,我应该这样做:
    Both types delete 0000.*
    Both types skip 0001.*
    Both types delete 0002.*
    etc.

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

    最佳答案

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

    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

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

    关于Bash 删除目录中的一半文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32602695/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com