Удалить файлы, которые соответствуют регулярному выражению - PullRequest
2 голосов
/ 04 марта 2011

Самый короткий и лучший способ удалить все файлы из каталога, которые соответствуют определенным регулярным выражениям в Perl в Windows.

Мой пример: удалить все *.txt файлы из каталога, но оставить tmp.txt?Окна.

Ответы [ 5 ]

4 голосов
/ 04 марта 2011
chdir $dir or die $!;
unlink grep { $_ ne 'tmp.txt' } <*.txt>;
3 голосов
/ 04 марта 2011
# glob gets the names of all .txt files
# we apply grep to remove tmp.txt from the list
@files = grep (!/^tmp\.txt$/,glob('*.txt'));

# delete the files
unlink @files;
1 голос
/ 05 марта 2011

Все вышеперечисленные решения потенциально проблематичны, если в каталоге много файлов (10 000 или более), поскольку все они читаются сразу во всем списке файлов.Безопаснее всего делать итерацию по каталогу, а не читать все сразу.«readdir» может возвращать только следующую запись в скалярном контексте.Я рекомендую обновить ответ @ hpvac циклом while, который просматривает каталог по одной записи за раз.

(Если вы уверены, что огромное количество файлов никогда не будет, решения, приведенные выше, работоспособны.)

1 голос
/ 04 марта 2011

Хотя и не идеально, может быть, что-то затянуто поможет.

use strict;
use warnings;

my $dir = "/tmp";
my $posreg = '.*\.txt$';
my $nexreg = '^tmp\.txt$';

opendir(my DH, $dir) || die($!);
{
    for my $file (grep { /$posreg/i
                    && ! /$negreg/i
                    && -f "$dir/$_" } readdir($DH))         
    {
        unlink($file) || die($!);
    }
}
closedir();
0 голосов
/ 04 марта 2011

Существует утилита perl: prename (rename на большинстве linux), просто используйте ее в сочетании с rm:

prename `s/(?!tmp.txt)\.txt$/DELETE_THIS_$&` 
rm DELETE_THIS_*

После ввода ответа я увидел, что вы спрашивали о решении для Windows,Я думаю, что вам лучше всего скачать (исходный код Perl) имя и немного отредактировать его, чтобы он работал с Windows.

...