2013-05-27 58 views
1

我有一個Perl腳本讀取目錄,並打印出的文件中其他的事情,目錄,但是我不能這樣做,因爲我沒有讀取權限..即使我已將它們設置在xubuntu中,也沒有讀取權限?

sub func { 
    my $some_dir = $_[0]; 
    opendir(my $DIR, $some_dir) or die "ERROR!"; 
    while (my $file = readdir($DIR)) { 
     if (-r $file) {    # Read permissions 
      print "hurray $file!\n"; 
      if (-d $file) {   # Directory 
       print "entering dir...\n"; 
       func($file); 
      } 
     } else {      # No read permissions.. 
      print "no permissions for $file\n"; 
     } 
    } 
    return; 
} 

如果我運行此代碼與文件夾結構:

file 
folder 
-file 
-file 
-folder 
--file 
--file 

我得到:

hurray file! 
hurray folder! 
entering dir.. 
no permissions for file 
no permissions for file 
no permissions for file # no idea why?? should be folder 
no permissions for file 
no permissions for file 

所以只打印是在起始目錄中的文件/文件夾,一切^ h因爲沒有讀取權限。我試着然後做chmod 777 file所有的子目錄中的文件,但我得到了相同的結果..

任何想法?

謝謝。

編輯 - 增加了一些東西清理混亂。

+0

你有你的文件夾'execute'位設置? – devnull

+0

我相信是這樣的,做'ls -l'會顯示'drwxrwxrwx'這個文件夾,我試圖讀取其中的內容。 – Travv92

+0

也許你應該嘗試在失敗消息中打印文件名,例如''沒有'$ file'的權限\ n「'。 – TLP

回答

3

這裏是readdir文檔(由perldoc -f readdir獲得):

返回由「執行opendir」打開一個目錄下一個目錄條目。如果在列表 上下文中使用,則返回目錄中剩餘的所有條目。如果沒有更多的 條目,返回標量上下文或在列表上下文空列表的一個未定義的值。

如果您打算測試「readdir」中的返回值,則最好在 之前加上相關目錄。否則,因爲我們沒有「CHDIR」有,那就 一直在測試了錯誤的文件。

opendir(my $dh, $some_dir) || die "can't opendir $some_dir: $!"; 
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir($dh); 
closedir $dh; 

這樣:

  1. if (-r $file)將無法​​正常工作,你將不得不說if (-r "$some_dir/$file")

  2. readdir也將返回目錄 ''和'..',你可能對這些不感興趣。

+0

嗨,只是用'-r $ some_dir/$ file'和'-r $ some_dir \/$ file'試過這個,結果相同..編輯!沒關係,它有點修補作用。謝謝! – Travv92

+0

這是因爲當您仔細閱讀腳本的輸出時,第二個問題應該變得明顯:「輸入目錄..」 – innaM

1

問題是你的工作目錄沒有改變。例如,假設您的起始目錄是/home

opendir(my $DIR, $some_dir) or die "ERROR!"; # working dir is /home 
while (my $file = readdir($DIR)) { 
    if (-r $file) {        # checks for /home/$file 
     print "hurray $file!\n";    # but path is /home/folder/$file 
     if (-d $file) { 
      print "entering dir...\n";   
      func($file);       # enters /home/folder/$file 

所以從/home,腳本無法查看文件folder/file,或者,你指的是一個至少不會。我發現我的測試目錄中有一些類似命名的文件,我的腳本工作目錄中有誤報。

解決方法是根據情況選擇chdir,或者在檢查權限時將路徑添加到文件名。你也應該補償.(當前目錄)和..(父目錄)。當我按原樣運行腳本時,它變成了一個無限循環。

當然但是,最好的解決辦法是使用適當的模塊,作業:File::Find

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

my $file = shift; # your file name 
find(sub { if (-r) { print "Hurray $File::Find::name\n"; } }, $file); 

這將遞歸經過一個文件夾,並打印出符合-r權限的文件的名稱。如果你讀了File::Find的文檔,你會發現,find子程序自動更改目錄,並使用變量:

$_     # file name e.g. 'file.txt' 
$File::Find::name  # full relative path e.g. 'folder/file.txt' 
$File::Find::dir  # current folder name e.g. 'folder' 
+0

對於「File :: Find」建議+1。我討厭'readdir'。 – innaM

+0

'readdir'是一個確切的工具,可以是好的也可以是壞的。大多數情況下,我認爲使用'glob'更簡單,更合適。當然,File :: Find用於遞歸。 – TLP

相關問題