2014-12-07 57 views
0

我有一個腳本,它創建一個新目錄,然後遍歷不同(源)目錄的所有內容,並在新目錄中創建鏈接到每個元素源目錄。腳本的相關部分是:Perl -e文件測試無法識別無效鏈接

use strict; 
use warnings; 
use Getopt::Long; 
use Cwd 'getcwd'; 
use Cwd 'realpath'; 
#... 
opendir ($LC, $source_dir) or die "Cannot open directory: '$source_dir': $!"; 

while ($entry = readdir $LC) { 
    next if $entry =~ /\A\.\.?\z/; 
    print "-I- Creating a link $entry\n"; 
    system "ln -s ".realpath("${source_dir}/${entry}")." ${new_dir}/$entry"; 
    die "-E- couldn't create link ${new_dir}/$entry ... exiting.\n" unless -e "${new_dir}/$entry"; 
} 

closedir $LC; 
#... 

當源目錄中的某個文件是死鏈接時,就會出現問題。命令ln在新目錄中創建一個名爲/new_dir/dead_link的文件,它鏈接到/source_dir/deal_link,但由於/source_dir/deal_link鏈接到一個不存在的文件,因此-e命令將/source_dir/deal_link識別爲不存在並調用die命令。

運行ls -ltr /new_dir/dead link給出:

lrwxrwxrwx 1 user ttt 44 Dec 7 07:40 /new_dir/dead_link -> /source_dir/dead_link 

我怎麼能這樣做,如果該文件存在,無論它鏈接到-e將只檢查?

+0

那爲什麼說這個文件不存在,而ls表示存在? – SIMEL 2014-12-07 14:10:18

+0

@mpapec,請參閱編輯。另外,除非(-e「$ {source_dir}/$ {entry}」);'添加行'next'會導致循環跳過死鏈接,並且不會嘗試複製它(這不是我所需要的,我需要目錄是相同的)。 – SIMEL 2014-12-07 14:14:07

+1

你見過'-l' – 2014-12-07 14:16:09

回答

3

要計算一個符號鏈接爲「現有」如果存在的話,不論該文件是否不是它指向同樣存在,你可以這樣做:如果指定的文件

(-e "$newdir/$entry" || -l "$newdir/$entry") 

-l測試返回true是一個符號鏈接,並不關心它鏈接的位置。但是對於任何不是符號鏈接的東西都會返回false,所以您仍然需要-e來處理其他類型的文件。

+0

不需要'-e'。只要'-l'將返回* false *如果名稱不存在 – Borodin 2014-12-07 14:32:33

+1

@Borodin:但是如果它不是鏈接也會返回false – ysth 2014-12-07 17:52:58

+0

@ysth:但是他*知道*這是他剛創建的鏈接它。事實上,如果'ln -s'失敗了,因爲已經有一個名稱爲節點,那麼他*不需要真正的值。 – Borodin 2014-12-07 18:10:33