2011-12-12 137 views
1

我正在使用File :: Find和文件I/O文本文件解析一系列的目錄並將內容移動到一個新的文件夾。這是一個簡單的腳本(見下文):Perl查找 - 沒有這樣的文件或目錄

#!/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 

當我上個月執行它的代碼工作,但它現在回來了「文件或目錄未找到「錯誤。實際的錯誤是「沒有這樣的文件或directoryerDocuments/coastalalglive/Account2805」。我知道它正在搜索的所有目錄都存在。我手動鍵入其中一個目錄,腳本執行正常:

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

我不知道爲什麼錯誤被返回。先謝謝您的幫助。

+1

這不是實際的錯誤,實際的錯誤將包括行號。 – TLP

+0

system()命令返回什麼? $ rc = system(...); print $ rc >> 8 – JRFerguson

+2

爲什麼使用系統調用而不是像'mkdir()'或File :: Copy-> move()'這樣的函數? – CanSpice

回答

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 $!; 
+0

更改'chomp'解決了問題。謝謝! – Bic

相關問題