Как использовать команду find (с sudo) внутри скрипта perl? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть эти файлы в pwd:

$pwd
/home/user/Desktop/perl
$ls
file.txt   foo.c   bar.c

Теперь, команда find:

$sudo find / -type f -name foo.c
/home/user/Desktop/perl/foo.c
find: ‘/proc/1764/task/1764/net’: Invalid argument
find: ‘/proc/1764/net’: Invalid argument
/run/live/persistence/sda5/rw/home/user/Desktop/perl/foo.c
/usr/lib/live/mount/persistence/sda5/rw/home/user/Desktop/perl/foo.c

Итак, совпадение с первым путем, что find найдено. Теперь я хотел бы захватить оба файла (foo.c и bar.c) в perl скрипте:

#!/usr/bin/perl -w

@ar=("foo.c", "bar.c");
@ar2=`sudo find / -type f -name $_ | head -n1` for @ar;
print "$_\n" for @ar2

output :

find: ‘/proc/1764/task/1764/net’: Invalid argument
find: ‘/proc/1764/net’: Invalid argument
find: ‘/proc/29943’: No such file or directory
find: ‘/proc/1764/task/1764/net’: Invalid argument
find: ‘/proc/1764/net’: Invalid argument
find: ‘/proc/30037’: No such file or directory
/home/user/Desktop/perl/bar.c

As вы можете видеть, я могу использовать sudo внутри (backticks), but the result will not assign to the array properly (it gets only one of the files from the list, not both) even in list context. So how to properly find files in perl from `root` (and thus must with sudo privileges) via в perl?

1 Ответ

0 голосов
/ 03 августа 2020

Лучше всего не раскошелиться. File :: Find :: Rule отлично подходит для таких вещей.

use warnings;
use strict;

use File::Find::Rule;

my $search_dir = '/';
my @files = qw (
    foo.c
    bar.c
);
 
my @results = File::Find::Rule->file()
                            ->name(@files)
                            ->in($search_dir);

print "$_\n" for @results;

Результаты:

$ sudo perl find.pl
/root/foo.c

Обратите внимание, что если вы не используете систему perl при использовании sudo вам может потребоваться убедиться, что ваш файл sudoers имеет правильный путь perl. Вот пример моей системы, которая запускает 5.26.1 через perlbrew в моем домашнем каталоге:

Defaults secure_path="/home/steve/perl5/perlbrew/perls/perl-5.26.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

По сути, я просто добавил путь perl bin в начало существующего secure_path запись вместе с завершающим двоеточием (с использованием visudo).

...