【问题标题】:Remove all files that start with same prefix, but different filetype删除所有以相同前缀开头但文件类型不同的文件
【发布时间】:2014-07-30 00:59:26
【问题描述】:

如何删除文件夹中以相同前缀开头的所有文件?例如:

我有文件:

SVM1.txt
SVM2.csv
SVM3.mat
helloworld.txt
README.txt

我想删除所有以“SVM”开头的文件。请注意,它们以相同的前缀开头,但文件类型不同!

【问题讨论】:

    标签: bash rm


    【解决方案1】:

    当然是通配符。

    rm SVM*
    

    【讨论】:

    • 当然,我们至少可以将 Goldberg 发送到 for i in $(seq 1 3); do rm SVM${i}*; done。正确有效地做这件事的乐趣在哪里?
    • @DavidC.Rankin 在 shell 脚本中几乎从来没有只有一种方法可以正确地做某事。
    • 抱歉,我认为包含“Goldberg”(如在 Rube Goldberg 中)会在评论中传达适当的诚意......
    • @DavidC.Rankin 我得到了讽刺,但仍然存在for i in SVM*; do rm "$i"; donekhadija's solution 优于rm SVM* 的合理案例。
    • 你是对的。 “给猫剥皮”有很多不同的方法,经验告诉你,女巫最适合任何场合。在另一种情况下,declare -i n=1; while test "$n" -le 3 ; do rm SVM${n}*; ((n++)); done 也可能是合适的。
    【解决方案2】:

    除了直白

    rm SVM*
    

    如果有很多很多匹配的文件,可能会失败(命令行太长),你可以使用

    find . -prune -name 'SVM*' -exec rm {} +
    

    它将一次对尽可能多的文件重复运行rm,直到删除所有匹配的文件。 -prune 阻止 find 进入任何子目录以查找匹配文件。

    【讨论】:

      【解决方案3】:

      在文件所在的目录中,

      ls | grep '^SVM.*' | xargs rm

      在 grep ^SVM.* 处停下来仔细检查您是否有要删除的正确文件,然后添加 xargs rm。

      【讨论】:

      • 这充其量是低效的(查找和过滤文件的两个进程,加上一个rm 每个文件),最坏的情况是错误的(当文件名包含换行符时) )。
      • 所以为了澄清,如果使用 rm SVM*,在 shell 执行命令行扩展之后,这是否意味着只有一个 rm 应用于所有文件?
      • @khadija 是的,虽然我不认为你在做什么保证 -1。 rm SVM* 将在 ARG_MAX 上失败,您的语法将在带有换行符的文件上失败,但示例中不存在这两种情况。
      • @khadija 虽然你可能想引用'^SVM.*'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多