Фильтр сценария оболочки du и поиск по строке внутри файла в подпапке - PullRequest
2 голосов
/ 30 мая 2010

У меня есть следующая команда, которую я запускаю на cygwin:

find / cygdrive / d / tmp / * -maxdepth 0 -mtime -150 -типа d | xargs du --max-deep = 0> folderizesreport.csv

Я собирался сделать с этой командой следующее:

для каждой папки в /d/tmp/, которая была изменена за последние 150 дней, проверьте ее общий размер, включая файлы в ней, и сообщите об этом в файл foldersizesreport.csv однако для меня этого сейчас недостаточно, как это оказывается внутри каждого

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

так, как вы видите внутри каждой подпапкиX, есть файл с именем somefile.properties внутри него есть свойство SOMEPROPKEY=3808612800100 (среди прочих свойств)

это время в миллисекундах, мне нужно изменить команду, чтобы вместо -mtime -150 она включала только весь расчет вложенная папка X, внутри которой находится файл somefile.properties, где SOMEPROPKEY=3808612800100 - это время в миллисекундах в будущем, если значение SOMEPROPKEY=23948948 находится в прошлом, вообще не включайте папку в foldersizesreport.csv, потому что это не относится ко мне.

поэтому отчет о результатах должен выглядеть следующим образом:

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

и если subfolder3 имеет SOMEPROPKEY=34243234 (время в миллисекундах в прошлом), то его не будет в этом CSV-файле.

так что в основном я ищу:

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 Ответ

2 голосов
/ 30 мая 2010

Вот версия Perl для всего этого:

filter.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
...