2011-10-11 56 views
6

一個目錄,如果一個文件是目錄使用我知道你可以測試:測試,如果文件不是在Perl

if(-d $filename) 

但你怎麼能測試,如果它不是一個目錄?

+2

可能的重複[如何區分一個文件與Perl目錄?](http://stackoverflow.com/questions/206320/how-do-i-distinguish-a-file-from- a-directory-in-perl) –

+1

規範的堆棧溢出問題是* [如何區分一個文件與Perl目錄?](http://stackoverflow.com/questions/206320)*。 –

回答

15

你有沒有想過嘗試以下方法?

if (! -d $filename) ... 

-d結果是,畢竟,這東西可以被視爲一個布爾值,因此邏輯非運算符!將正常工作。

而且,如果您之後更具體比「不是目錄」,請參閱here。有相當多的東西不是目錄,有時候把它當作普通文件是沒有意義的。

請記住,假設您已經驗證文件名存在。如果您使用不存在的文件名執行! -d,它將返回true。

這是一個哲學的事,你是否考慮一個不存在的東西是「不是一個目錄」,但是,如果你想確保它的存在,以及,你可以結合使用! -d-e,是這樣的:

if ((-e $filename) && (! -d $filename)) ... 
+3

我剛剛達不到30個字符足夠快......我認爲這個問題實際上讓我震驚。 –

+2

請注意:根據你如何解析OP的需要,這個答案可能是錯誤的。我解析它的方式,他想知道某個文件是否是文件,但不是目錄 - 即使對於不是文件的東西(例如'!-d NO_SUCH_FILE'返回true),該回答也會返回true。 – DVK

+0

@DVK,在這一點上的好點,更新的答案適合。 – paxdiablo

2

-f運算符測試以查看是否有「常規文件」。這不包括目錄,但也排除了諸如管道和設備節點之類的東西。

if (-f $filename) { ... 
3

TIMTOWTDI精神:

unless (-d $filename) 
+0

雖然非常優雅 – Pavel

5

爲了測試某個東西是一個文件,而不是一個目錄,則需要簡單地將兩個測試(沒有單一的測試):

if (-e $file && !-d $file) { # a file but not a directory } 

請注意:

  • 在所有應有的尊重,paxdiablo的答案是錯誤的問題措辭的方式(純粹!-d不適用於什麼用戶問,因爲它檢查如果一個隨機的東西/字符串不是一個目錄,而不是一個文件是什麼不是一個目錄)。例如。 !-d NO_SUCH_FILE返回true。

  • 格雷格的回答可能是正確的,這完全取決於原始用戶是否意圖在「非目錄文件」的定義中包含非純文件(例如符號鏈接,命名管道等)。如果他們打算包括所有這些特殊的「檔案」,格雷格的回答也是錯誤的,因爲「-f」排除了他們(正如Greg首先在他的回答中明確指出的那樣)。

相關問題