2009-12-01 96 views
0

我得到當我運行該腳本的結果「找不到文件」:如何查找Windows路徑下的所有lib目錄?

use File::Basename; 

my @dirs = grep { fileparse($_) =~ /^[L|l]ib/ } 

split /\n/, dir e:\\/ad/b/s; 

print @dirs; 

這是我的實際代碼。我正在嘗試grep在整個驅動器中的名稱爲libLib的目錄和子目錄。

+0

呃,第二行是幹什麼的? – 2009-12-01 06:00:33

+0

這一行:split/\ n /,dir e:\\/ad/b/s; < - 是你的問題。爲什麼不使用glob來查找以[lL] ib開頭的文件? – ghostdog74 2009-12-01 06:42:28

+1

請顯示您的實際代碼。你似乎缺少那裏的一些零件 – ysth 2009-12-01 06:42:45

回答

2

任何數量的東西。

  • 我希望您使用的是在您的文章迷路反引號:
  • 但你並不需要split,如果你使用反引號,因爲它會回來的名單。
  • 我不認爲[L|l]意味着你認爲它的意思。如果您的意思是大寫「L」或小寫「l」,則不需要交替符號。正確的表達是[Ll](或(?i:l)ib這意味着我們本地化的I位爲組。)

所以,如果它看起來像這樣:

use File::Basename; 

my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ } qx{dir /AD /B /S e:\\}; 

這應該工作,如果有任何與之相匹配的東西。只要確保您使用qx運算符或反引號。

+0

+1,但你錯過了'%PATH%'中另一個'dir'程序的可能性。 – 2009-12-01 12:09:09

3

如果您正在使用從my answer to your previous question的代碼,我能想到的唯一的事情是,有可能是你的路徑上一些外部dir.exe不理解內置dircmd.exe的命令行選項。例如,Cygwin的在我的路徑中的目錄,我得到

 
dir: cannot access /ad/b/s: No such file or directory 

也應該得到展示的習慣確切輸出,如果你希望人們能夠你得到幫助你更有效。

要確保不發生,用途:

use strict; use warnings; 

use File::Basename; 

my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ } 
      split /\n/, `cmd.exe /c dir e:\\ /ad/b/s`; 

print "$_\n" for @dirs; 

注意反引號```。還要注意對您正在使用的模式的修正。

+0

@Sinan,我認爲@lokesh是Windows XP用戶。我測試了他從你那裏借來的代碼,它沒有任何有趣的工作。所以現在我想他正在使用其他系統。 – Mike 2009-12-01 12:28:19

+2

@Mike:我在Windows XP上。當我在路徑中放入'c:\ opt \ cygwin \ bin'時,'No such file or directory'是我得到的消息,因爲Cygwin的'dir.exe'認爲'/ ad/b/s'是路徑。 (用'E:\'完全可以)。所以,@ lokesh在路徑中必須有其他'dir'。解決方案是顯式調用'cmd.exe'的內置dir,它可以理解傳遞給它的選項。 – 2009-12-01 13:35:08

+0

@Sinan,你的解釋很有道理。 – Mike 2009-12-01 14:35:05

相關問題