Одна из забавных вещей, которые происходят с tar-бомбами, заключается в том, что они меняют права доступа к текущему каталогу на те, что включены в tar-архив.
Например, если архив содержит '.' каталог, и вы распаковываете его в /tmp как root, это разрушит вашу систему, сделав /tmp недоступным для записи кем-либо, кроме root.
$ 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