代码之家  ›  专栏  ›  技术社区  ›  Jas

shell脚本筛选du并按子文件夹中文件内的字符串查找

  •  2
  • Jas  · 技术社区  · 14 年前

    查找/cygdrive/d/tmp/*-maxdepth 0 -mtime-150-d型| xargs du——最大深度=0>文件夹大小报表.csv

    我打算使用此命令执行以下操作:

    下的每个文件夹 /d/tmp/ foldersizesreport.csv 然而,现在这对我来说还不够好,因为事实证明,在每个人身上

    /d/tmp/subfolder1/somefile.properties
    /d/tmp/subfolder2/somefile.properties
    /d/tmp/subfolder3/somefile.properties
    /d/tmp/subfolder4/somefile.properties
    

    因此,在每个子文件夹中都有一个名为 somefile.properties 里面有一处房产 SOMEPROPKEY=3808612800100 (除其他财产外)

    这是以毫秒为单位的时间,我需要更改命令以便 -mtime -150 它将只包括在整个计算中 其中包含文件的子文件夹 somefile.properties属性 在哪里 SOMEPROPKEY=3808612800100 如果值 SOMEPROPKEY=23948948 文件夹大小报表.csv 因为这和我无关。

    /d/tmp/,subfolder1,<itssizein KB>
    /d/tmp/,subfolder2,<itssizein KB>
    

    如果 subfolder3 有一个 SOMEPROPKEY=34243234

    所以基本上我要找的是:

    find /cygdrive/d/tmp/* -maxdepth 0 -mtime -150 -type d | 
       <only subfolders that have in them property in file 
       SOMEPROPKEY=28374874827 - time in ms in future and 
       not in past | xargs du --max-depth=0 > foldersizesreport.csv
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   user180100 user180100    14 年前

    下面是整个过程的perl版本:

    过滤器.pl

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use File::Spec;
    
    # -------------------------- configuration ----------------------------
    my %CFG = (
           'propertiesFile' => 'somfile.properties',
           'propertyKey' => 'SOMEPROPKEY',
           'duCommand' => 'du -Bk -s'
    );
    # ---------------------------------------------------------------------
    
    while (my $dir = <>) {
           chomp $dir;
           open(my $F, File::Spec->catfile($dir, $CFG{"propertiesFile"})) || next;
           my ($match) = grep /$CFG{"propertyKey"}=\d+/, <$F>;
           close $F;
    
           if ($match =~ m/$CFG{"propertyKey"}=(\d+)/) {
                   my ($volume, $directories, $file) = File::Spec->splitpath($dir);
                   my $command = "$CFG{'duCommand'} $dir";
                   # on Windows you might need $volume this assumes Unix-like filesystem
                   print $directories . "," . $file . "," .
                           `$command | cut -f1` if $1 > time();
           }
    }
    
    exit;
    

    使用

    find /home/regis/stackoverflow/2937940/* -maxdepth 0 
      -mtime -150 -type d | ./filter.pl
    

    输出(带样品)

    /home/regis/stackoverflow/2937940/,subfolder1,16K
    /home/regis/stackoverflow/2937940/,subfolder2,16K
    /home/regis/stackoverflow/2937940/,subfolder4,16K