2009-06-26 67 views
13

在Perl中,如何創建子目錄並同時創建父目錄(如果它們不存在)?像UNIX的mkdir -p命令一樣?從文件::路徑模塊如何在一個Perl命令中創建目錄和父目錄?

+0

添加了此問題,以便我將來能夠輕鬆再次找到它,而不是每次都查看它。由於某種原因,我總是在POSIX.pm查找這個。 – skiphoppy 2009-06-26 17:50:57

回答

22
use File::Path qw(make_path); 
make_path("path/to/sub/directory"); 

棄用的mkpath和首選make_path從討論梗在Perl 5名搬運工跟帖說已經封存here

簡而言之,Perl 5.10測試在makepath()接口的參數分析中出現了尷尬。所以它被替換爲一個簡單的版本,它將散列作爲設置函數選項的最終參數。

+3

@skiphoppy:這仍然不是「像UNIX的mkdir -p命令」,如問題中所述。 mkdir的手冊頁顯示 -p, --parents no error if existing, make parent directories as needed但是如果目錄存在,make_path將返回false。 (即,make_path「/ tmp/foo」或die;#如果/ tmp/foo存在,將會死亡) – Randall 2011-05-17 16:48:31

3

使用mkpath:

use File::Path qw(mkpath); 
mkpath("path/to/sub/directory"); 
+1

剛纔研究了這一點,我發現mkpath()已被棄用,官方界面現在是make_path()。如果有人就我​​們購買的產品寫了一個很好的解釋,我會將其作爲公認的答案。 – skiphoppy 2009-06-26 17:52:00

3

,如果你正在尋找一個Perl的請無視用「的mkdir -p」的功能,但下面的代碼模塊將工作:

my $dir = '/root/example/dir'; 

system ("mkdir -p $dir 2> /dev/null") == 0 
    or die "failed to create $dir. exiting...\n"; 

您可以使用一個模塊,但你必須給你要你的代碼移植在每臺服務器上安裝它。我通常更喜歡使用系統函數來處理像mkdir這樣的工作,因爲當我僅需要一次創建目錄時,導入和調用模塊的開銷較小。

+0

如果您想避免安裝模塊,那麼這種方法是有意義的。我通常更喜歡要求安裝我需要的模塊,或者我拒絕支持該系統。 :)我更喜歡使用模塊,因此我可以從測試和研究中獲益,因此可以避免錯誤,例如無法檢查系統調用或丟失錯誤消息的輸出,並且因爲沒有錯誤創建一個流程。 – skiphoppy 2012-09-17 14:48:11

相關問題