Как использовать команду находки в сценарии Perl?

Случается так, что NetworkManager отказывается находить или не находит?

Так или иначе я предложил бы Вас, проверьте, доступна ли беспроводная сеть для других устройств, означая, что беспроводная сеть не самостоятельно вниз? Также проверьте состояние беспроводного адаптера стороны клиента с помощью lspci команда. Выполненный service wpa_supplicant restart и посмотрите, помогает ли это также.

1
15.02.2013, 21:03
2 ответа

Поскольку Вы используете одинарные кавычки вместо двойных кавычек.

Perl не интерполирует переменные, включенные в одинарные кавычки, поэтому что Вы делаете, отправляет строке '$srceDir' в оболочку, которая будет обычно сбрасываться (очищают), если у Вас нет его набор в Вашей среде где-нибудь.

Попробуйте это:

my $find_cmd = "find $srceDir -type f -newermt 2013-02-14 ! -newermt 2013-02-15";

или лучше это:

my $find_cmd = sprintf
    'find "%s" -type f -newermt 2013-02-14 ! -newermt 2013-02-15',
    $srceDir;

... забота о пробелах, в то время как find_cmd был бы выполнен под разветвленным sh.

* Важный комментарий *

Как @vonbrand справедливо прокомментировал: действительно предлагает много библиотек для обеспечения коммуникации между Вашей программой и многими другими вещами.

Для операции файловой системы find, жемчуг использует File модуль библиотеки File::Find, для которого существует немного утилиты find2perl который переведет Ваш find командная строка в небольшой сценарий жемчуга:

$ find2perl -type f -mtime -3 ! -mtime -2;
#! /usr/bin/perl -w
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if 0; #$running_under_some_shell
use strict;
use File::Find ();

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;

# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '.');
exit;

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);
    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _ &&
    (int(-M _) < 3) &&
    ! (int(-M _) < 2)
    && print("$name\n");
}

Таким образом, Ваша потребность могла стать чем-то вроде этого:

#! /usr/bin/perl -w

my $srceDir   = "/mnt/SDrive/SV/Capture Data/";
my $startDate = "2013-02-14";
my $endDate   = "2013-02-15";

use strict;
use File::Find ();
use POSIX qw|mktime|;

use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

my ($sDay,$eDay)=map {
    my ($year,$month,$day)=split("-",$_);
    (time()-mktime(0,0,0,$day,$month-1,$year-1900))/86400
} ($startDate,$endDate);

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _ &&
    (-M _ < $sDay) &&
    ! (-M _ < $eDay)
    && print("$name\n");
}
File::Find::find({wanted => \&wanted}, $srceDir );

Лучшее преимущество выполнения этого, вместо open $fh,"find ...|", это, это очень устойчиво; Вы не должны заботиться о символах, существующих в именах файлов (как пробелы, кавычки, амперсанд...).

6
27.01.2020, 23:12
  • 1
    , ничего себе, это работает. большое спасибо за Вашу справку :). –  oanh 15.02.2013, 21:28
  • 2
    Большая выгода! Но Perl имеет File::Find <perldoc.perl.org/File/Find.html>, который позволяет Вам интегрировать функциональность непосредственно в сценарий. –  vonbrand 15.02.2013, 21:59
  • 3
    @oanh, Если этот ответ решил Вашу проблему, не забывает отмечать его, как принято и/или upvote он вместо того, чтобы добавить спасибо комментарий. Это - способ, которым благодарность выражена на сайтах SE. –  terdon♦ 16.02.2013, 02:28
  • 4
    Ваша логика о (int(-M _) < $sDay) является неправильным, если Вы не запускаете свой скрипт в полночь (и даже затем, я предполагаю, что изменения DST испортили бы вещи). Отметьте это Date::Parse не один из базовых модулей жемчуга (вопреки File::Find или POSIX (mktime) или теперь Time::Piece). При помощи find "%s" ..., у Вас все еще будут проблемы с именами файлов с двойной кавычкой, обратной галочкой, долларом или символами обратной косой черты. –  Stéphane Chazelas 16.02.2013, 21:33

При предоставлении одной строки с метасимволами оболочки (как пространство) для команды затем, это будет интерпретироваться как командная строка оболочки, что означает две вещи:

  1. Дополнительная команда должна быть выполнена (оболочка для парсинга той командной строки), который не очень эффективен. С некоторыми реализациями оболочки, который даже означает дополнительный процесс.
  2. Необходимо выйти из специальных символов к оболочке.

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

Кроме того, если Вы не используете -print0, вывод find не может быть выполнен последующую обработку безопасно, потому что записи разделяются с символами новой строки, в то время как новая строка является совершенно допустимым символом в имени файла, так как я сказал в своем ответе на Ваш подобный вопрос, необходимо будет записать это как:

my $srceDir = "/mnt/SDrive/SV/Capture Data";
my @find_cmd = ("find", $srceDir, "-type", "f", "-newermt", "14 Feb 2013", "-print0");

open FIND, "-|", @find_cmd;
$/ = "\0"; # set perl's record separator
while (<FIND>) {
  ...
}
close FIND or warn $! ?
  "Error closing find pipe: $!" :
  "find exited with non-zero exit status: $?";

(и BTW, find не производит total строки, можно сбивать с толку с ls).

3
27.01.2020, 23:12
  • 1
    Узла На том, какое условие могло close FIND сбой? –  daisy 16.02.2013, 12:44
  • 2
    @warl0ck close or warn $! ? "Error $!" : "Error, rc was: $?" ; statment является чистым, хорошим и безопасным способом закрыть каналы команды, чтобы разрешить отлаживать для образца. (+1 для Stephane, только для этого :). Вообще, для контакта со сложными именами файлов и сокращения вызовов ветвления, предпочитая пользоваться библиотеками стандартов, как File::Find хорошая практика! –  F. Hauri 16.02.2013, 18:36

Теги

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