1

File::Findとファイル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」です。私はそれが検索しているすべてのディレクトリが存在することを知っています。ディレクトリの1つを手動で入力しましたが、スクリプトは正常に実行されます。

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

エラーが返される理由がわかりません。助けてくれてありがとう。

4

1 に答える 1

5

あなたのエラー:

"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。例えば:

move $_, "/opt/CollectMinderDocuments/coastalalglive/Closed/$smallerStr/" or die $!;
于 2011-12-12T18:59:34.917 に答える