Perl Find - нет такого файла или каталога - PullRequest
1 голос
/ 12 декабря 2011

Я использую File :: Find и file i / o для текстового файла, чтобы проанализировать серию каталогов и переместить содержимое в новую папку. Это простой скрипт (см. Ниже):

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;
use File::Copy;

my $dir = "/opt/CollectMinderDocuments/coastalalglive"; #base directory for Coastal documents

#read file that contains a list of closed IDs
open(MYDATA, "Closed.txt");

mkdir("Closed");

while(my $line = <MYDATA>) {
  chomp $line;
  my $str = "$dir" . "/Account$line";
  print "$str\n";
  find(\&move_documents, $str);
}
sub move_documents {
  my $smallStr = substr $File::Find::name, 43;
  if(-d) {
    #system("mkdir ~/Desktop/Closed/$smallStr");
    print "I'm here\n";
    system("mkdir /opt/CollectMinderDocuments/coastalalglive/Closed/$smallStr");
    #print "Made a directory: /opt/CollectMinderDocuments/coastalalglive/Closed/$smallStr\n";
  }
  else {
    print "Now I'm here\n";
    my $smallerStr = substr $File::Find::dir, 43;
    my $temp = "mv * /opt/CollectMinderDocuments/coastalalglive/Closed/$smallerStr/";
    system("$temp");
  }
}

Текстовый файл содержит список чисел:

1234
2805
5467

Код работал, когда я выполнял его в прошлом месяце, но теперь он возвращает ошибку «файл или каталог не найден». Фактическая ошибка "Нет такого файла или директорииDocuments / coastalalglive / Account2805" . Я знаю, что все каталоги, которые он ищет, существуют. Я вручную набрал в одном из каталогов, и сценарий прекрасно работает:

find(\&move_documents, "/opt/CollectMinderDocuments/coastalalglive/Account2805/");

Я не уверен, почему возвращается ошибка. Заранее спасибо за помощь.

1 Ответ

5 голосов
/ 12 декабря 2011

Ваша ошибка:

"No such file or directoryerDocuments/coastalalglive/Account2805"

Кажется, подразумевается, что существует \r, который не был удален вашим chomp. Это произойдет при передаче файлов между различными файловыми системами, где файл содержит \r\n в конце строки. Строка реальной ошибки будет выглядеть примерно так:

/opt/CollectMinderDocuments/coastalalglive/Account2805\r: No such file or directory

Попробуйте вместо этого изменить chomp $line на $line =~ s/[\r\n]+$//; и посмотрите, работает ли это.

Также:

my $temp = "mv * /opt/CollectMinderDocuments/coastalalglive/Closed/$smallerStr/";
system("$temp");

Это очень неправильно. Первый не каталогный файл в этом цикле переместит все оставшиеся файлы (включая dirs? Не уверен, если mv делает это по умолчанию). Следовательно, последующие итерации подпрограммы не найдут ничего для перемещения, что также приведет к ошибке типа «Не найдено». Хотя и не тот, который захвачен perl, так как вы используете system вместо File::Copy::move. E.g.:

move $_, "/opt/CollectMinderDocuments/coastalalglive/Closed/$smallerStr/" or die $!;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...