Найдите список файлов, содержащих набор последовательных строк, определенных в другом файле

Вот окончательное решение, которое я протестировал, и оно сработало. Чтобы избежать поиска в смонтированных удаленных файловых системах, мне нужно было -mount, и чтобы не переходить по символическим ссылкам! -следить. Я хотел, чтобы в выводе отображались разрешения, чтобы я мог легко убедиться, что они соответствуют моим критериям, поэтому я использовал -ls. Сюрпризом было то, что «порядок аргументов» был очень важен. Пока я не нашел работающий порядок, команда возвращала некоторые результаты, которые были неправильными.

find -user userx -group groupz -mount \ {1}} ( (-perm -u = r -a! -Perm -g = r) -o \ ( -perm -u = w -a! -perm -g = w) -o \ (-perm -u = x -a! -perm -g = x) \ ) -ls ! -follow

1
23.09.2018, 13:26
2 ответа

Попробуйте:

find /path/to -type f ! -name 'reference_file' -exec python -c "import os;
if (open('/path/to/reference_file').read() in open('{}').read()): print '{}: can be deleted'" \;

замените print '{}: can be deleted'на os.remove('{}'), чтобы удалить этот файл, когда вы будете довольны результатом.

Похожие:

1
27.01.2020, 23:31

Если можно использовать perl, вот небольшой скрипт, который выполняет работу для одного файла, он просто читает ссылку и входной файл, пытается заменить шаблон ссылки пустой строкой. Если размер изменен, записывает в файл out. Вызовите его со ссылкой и введите имена файлов в качестве аргументов командной строки.

#!/bin/perl 

sub readfile {
  my ($filename) = @_;
  my $content;
  open(my $fh, '<', $filename) or die "cannot open file $filename"; {
    local $/;
    $content = <$fh>;
  }
  close($fh);
    return $content;
}

sub writefile {
  my ($filename, $content) = @_;
  open(my $fh, '>', $filename) or die "cannot open file for writing: $filename"; {
    print $fh $content;
  }
  close($fh);
}

my $txtref = readfile($ARGV[0]);
my $txtin = readfile($ARGV[1]);

my $txtout = $txtin;
$txtout =~ s/$txtref//g;

if (length($txtin) ne length($txtout)) {
    print STDOUT "changes, length ".length($txtin)." => ".length($txtout)."\n";
    my $outf = $ARGV[1].".out";
  writefile($outf, $txtout);
} else {
    print STDOUT "no changes\n";
}

Просто вставьте вызов в цикл оболочки, используя find -, например -, чтобы работать с содержимым каталога.

1
27.01.2020, 23:31

Теги

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