Вывод строк имен файлов с наибольшим номером

Одна из забавных вещей, которые происходят с tar-бомбами, заключается в том, что они меняют права доступа к текущему каталогу на те, что включены в tar-архив.

Например, если архив содержит '.' каталог, и вы распаковываете его в /tmp как root, это разрушит вашу систему, сделав /tmp недоступным для записи кем-либо, кроме root.

-3
30.06.2021, 14:06
1 ответ
$ perl -lne '($prefix,$num) = m/^(.*)_(\d+).*$/;
             if ($num > $n{$prefix}) { $f{$prefix} = $_; $n{$prefix} = $num };
             END { foreach (sort keys %f) { print $f{$_} } }' input.txt 
done_12000203.txt
shopping.list_292.txt
todo_91.txt

Этот быстрый и грязный хак perl извлекает префиксы и числа имен файлов из каждой входной строки и использует их для построения двух хэш-массивов-%nдля хранения максимального числа для каждого префикса имени файла и %fдля хранения связанного имени файла.. Оба хэша используют один и тот же ключ (с префиксом ).

Он фиксирует все до _как «префикс» и все цифры после_(до конца строки или до первого нецифрового символа -)в качестве числа.

Строки, не соответствующие шаблону регулярного выражения ^(.*)_(\d+).*$, полностью игнорируются. Если вы хотите, вы можете напечатать предупреждающее сообщение, если это произойдет (, оставленное в качестве упражнения для читателя ).

Прочитав ввод, он перебирает ключи одного из %fхэшей и печатает имя файла.


а вот немного более причудливая версия того же самого в виде отдельного perl-скрипта:

#!/usr/bin/perl

use strict;
my (%f,%n);

while(<>) {
  s/#.*//;          # strip comments (#)
  s/^\s+|\s+$//g;   # strip leading and trailing spaces
  next if (m/^$/);  # ignore blank lines
  chomp;   # strip newline from end of line.

  my ($prefix,$num) = m/^(.*)_(\d+).*$/;

  if ($num > $n{$prefix}) {
    $f{$prefix} = $_;
    $n{$prefix} = $num;
  };
}

foreach (sort keys %f) {
  print $f{$_}, "\n";
}

Сохраните его как, например, find-largest.pl, сделайте его исполняемым с помощью chmod +x find-largest.plи запустите так:

$./find-largest.pl input.txt 
done_12000203.txt
shopping.list_292.txt
todo_91.txt
1
28.07.2021, 11:21

Теги

Похожие вопросы