【问题标题】:Delete files with less than x characters in a directory删除目录中少于 x 个字符的文件
【发布时间】:2021-01-11 05:26:11
【问题描述】:

我正在尝试编写一个 bash 脚本,该脚本将目录作为参数并删除所有少于 4 个字符的文件。我的脚本目前如下:

#!/bin/bash

cd $1
rm ???
rm ??
rm ?

此方法有效,但只要存在没有

【问题讨论】:

  • 那么rm -f ?
  • rm -f ? ?? ??? 会让它静音,但它看起来很危险。如果您忘记为该脚本提供任何参数,它将cd 到您的主目录并在那里进行删除。
  • @KamilCuk 是的,谢谢。在最初查看 rm 命令的选项时,我完全错过了这一点

标签: linux bash


【解决方案1】:

您可以使用rm -f。来自man rm

-f, --force  
       ignore nonexistent files and arguments, never prompt

要防止文件名直接命名为 ---f,请使用前导 --

rm -f -- ? ?? ???

但是-f - 它看起来很危险(好像脚本中的rm 不够危险)。真正更好的选择是不使用通配符而使用find

find "$1" -maxdepth 1 -type f '(' -name '?' -o -name '??' -o -name '???' ')' -exec rm {} +

【讨论】:

    【解决方案2】:

    启用 nullglob 选项,以便删除不匹配任何文件的 glob。

    #!/bin/bash
    shopt -s nullglob
    
    cd "$1"
    rm ? ?? ???
    

    请注意,如果根本没有匹配的文件,您现在会收到错误消息:

    rm: missing operand
    Try 'rm --help' for more information.
    

    【讨论】:

      【解决方案3】:

      您可以将标准错误重定向到 /dev/null:

      rm ??? 2>/dev/null
      rm ?? 2>/dev/null
      rm ? 2>/dev/null
      

      【讨论】:

        【解决方案4】:

        “删除所有少于 4 个字符的文件”和“不使用循环或条件”可以使用:

        • 查找文件名长度在 1 到 4 个字符之间的所有文件: find . -type f -exec basename '{}' ';' | egrep '^.{1,3}$' 可以将 . 替换为所需的目录作为参数。

        • 之后你可以rm -f $(find . -type f -exec basename '{}' ';' | egrep '^.{1,3}$)'

        【讨论】:

          猜你喜欢
          • 2016-06-07
          • 2021-09-11
          • 1970-01-01
          • 1970-01-01
          • 2015-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多