【问题标题】:Find files with extensions consisting of numbers only查找扩展名仅由数字组成的文件
【发布时间】:2015-07-13 07:46:59
【问题描述】:

如何找到以“log.[一位或多位数字]”结尾的文件?

我在日志目录中有一个文件列表:

/user/log/log.1
/user/log/log.222
/user/log/log.201505
/user/log/log.2014.gz

我想gzip仅以数字结尾的文件,然后将它们移动到bak目录:

/user/bak/log.1.gz
/user/bak/log.222.gz
/user/bak/log.201505.gz

有什么方法可以同时使用 find / ls / 来包含模式(log.[0-9]*)并排除数字以外的扩展名/ grep 等等?

另外,我的情况需要我在其他服务器上也执行上面的日志备份,我只是使用

ssh $SERVER "command1;command2;..."

做这项工作,即使有循环?

谢谢。

【问题讨论】:

    标签: regex bash grep find ls


    【解决方案1】:

    使用 bash 扩展模式:

    shopt -s extglob
    numeric_extensions=( *.+([0-9]) )          # use an array for storage
    printf "%s\n" "${numeric_extensions[@]}"   # print the array contents
    

    【讨论】:

      【解决方案2】:

      这是您可以使用的单线。我已经在本地测试了执行。

      find /user/log/ -type f -name "log.*[0-9]" -exec bash -c 'gzip "{}" && mv "{}.gz" "/user/bak/"' \;
      

      您可以使用 ssh 调用它,如下所示:

      ssh user@$SERVER 'find /user/log/ -type f -name "log.*[0-9]" -exec bash -c 'gzip "{}" && mv "{}.gz" "/user/bak/"' \;'
      

      【讨论】:

      • 除“log.*[0-9]”外的简洁解决方案将包括“log.a123”等文件。我已将您的代码与@Ismail Badawi 的正则表达式结合起来,它工作正常。 find /user/log/ -type f -regex '.*/log\.[0-9]+' -exec bash -c 'gzip "{}" && mv "{}.gz" "/user/bak/"' \; 谢谢!
      • 如果没有匹配的文件,因此没有文件到 gz 和 mv,会发生什么?有什么方法可以将结果(如果有)重定向到日志文件?
      【解决方案3】:

      如果您不介意循环,这里有一个倡议:

      #!/bin/bash
      for file in /user/log/*; do
      if [[ -f $file ]]; then
      ext="${file##*.}"
      if [[ $ext =~ [0-9]$ ]]; then
      #only files with numeric extention are available here
      #put your gzip or whateve code here
      fi
      fi
      done
      

      【讨论】:

      • 由于我必须通过 ssh 连接到其他服务器并执行此操作,因此我希望它尽可能简单并避免循环。感谢您提供替代解决方案。
      【解决方案4】:

      我想出了一个类似的正则表达式:

      ^.+\/log\.[0-9]+
      

      【讨论】:

        【解决方案5】:

        您可以将-regex 标志用于find。您可能还需要-E 将正则表达式解释为现代扩展正则表达式。像这样的:

        find -E /user/log -regex '.*/log\.[0-9]+'
        

        【讨论】:

        • 抱歉,原来-E 来自 BSD 查找。如果没有它对你有用,那就太好了,否则你可以看看the -regextype flag
        • 感谢您的回复,但是上面的命令返回find: unknown predicate -E'`。但是,没有 -E 它可以正常工作。你介意在登录正则表达式之前解释一下 .*/ 是什么吗?
        • @haust 正则表达式必须匹配整个路径,在这种情况下包括 /user/log 前缀。 .*/ 表示“匹配任何内容,直到最后一个斜线”。在这种情况下,您也可以只写-regex '/user/log/log\.[0-9]+'
        • 解释的很清楚,谢谢。你介意回答案件的第二部分吗? “另外,我的情况要求我在其他服务器上也执行上述日志备份,我是否只需使用ssh $SERVER "command1;command2;..." 来完成这项工作,即使有循环?”
        猜你喜欢
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 2017-08-22
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多