12.目錄操作(perl筆記)

tonykorn97發表於2007-06-22
1,在目錄樹中移動
可以用chdir運算子來改變當前的工作目錄
chdir "/etc/" or die "Cannot chdir to /etc: $!";

2,Glob
my @all_files = glob "*";
my @pm_files = glob "*.pm";


2,Glob的另外一種語法
使用“角括號語法”來呼叫此功能,看起來就跟讀取檔案控制程式碼差不多:
my @all_files = ; # 和my @all_files = glob "*"; 完全一樣

角括號之間的值會對雙引號內的字串來進行替換,這表示在進行glob操作之前,角括號內的perl便利會先輩展開成它們當前的值。

my $dir = "/etc";
my @dir_files = ;
此處,因為$dir會被展開當前的值,所以會取得指定目錄下任何含點號以及不含點號的檔案。

假如角括號既表示從檔案控制程式碼讀取又代表glob,那perl如何決定用哪一種運算子呢?檔案控制程式碼必須是perl識別符號。如果角括號內的專案滿足perl識別符號的條件,就是從檔案控制程式碼讀取;否則,它代表的是glob。例如:
my @files = ; #glob
my @files = ; #從檔案控制程式碼讀取


3,目錄控制程式碼
若想從目錄裡取得檔名列表,還可以使用目錄控制程式碼。目錄控制程式碼看起來像檔案控制程式碼,使用起來也沒多大的差別。開啟(以opendir代替open ),讀取內容(以readdir代替readline),關閉(以closedir代替close).
my $dir_to_process = "/etc";
opendir DH, $dir_to_process or die "無法開啟 $dir_to_process:$!";
foreach $file (readdir DH) {
print "one file in $dir_to_process is $file ";
}
closedir DH;


4,移出檔案
unlink "slate","bedrock","lava";
unlink glob "*.o";


5,重新命名檔案
rename "old","new"


6,連線與檔案
硬連結
link "chicken", "egg" or warn "can't link chicken to egg:$!";
軟連結
symlink "dodgson", "carroll" or warn "can't symlink dodgson to carroll:$!";

要取得符號連結所指向的位置時,請使用readlink函式,它會返回符號連線所指向的位置,或在引數不時符號連線時返回undef;
my $where = readlink "carroll"; #得到"dodgson"

7,建立以及移出目錄
mkdir "fred", 0755 or warn "cannot makde fred directory:$!";

oct函式會強制把字串當成八進位制處理,無論它是否以0開頭
my ($name,$perm) = @ARGV;
mkdir $name, oct($perm) or die "cannot create $name:$!";

想要移出空目錄時,可以使用rmdir函式。
rmdir $_ for glob "fred/*" #移出fred/下所有的空目錄

foreach my $dir (qw(fred barney betty)) {
rmdir $dir or warn "cannot rmdir $dir:$! ";
}

如果目錄不為空,則rmdir運算子會執行失敗。你可以用unlink來刪除目錄的內容,再試著移出應該已經清空的目錄

my $temp_dir = "/tmp/scratch_$$"; #由程式識別符號決定。
mkdir $temp_dir,0700 or die "cannot create $temp_dir:$!";

unlink glob "$temp_dir/* $temp_dir/.*"; #刪除$temp_dir的內容
rmdir $temp_dir;


7,修改許可權
chmod 0755, "fred", "barney";

8,更改隸屬關係
chown會同時更改擁有者和所屬組,他們必須以數值形式的使用者識別符號已經組識別符號來指定:
my $user = 1004;
my $group = 100;
chown $user,$group, glob "*.o";

如果處理的不是數值,而是名稱,需要用getpwnam函式將名稱轉換成數值,再用相應的getgrnam將組名稱轉化成豎直就行了
defined (my $user = getpwnam "merlyn") or die "bad user ";
defined (my $group = getgrnam "users") or die "bad group ";
chown $user, $group, glob "/home/merlyn/*";

9,更改時間戳
如果你想修改某個檔案最近的更改或訪問時間以欺騙其他程式,可以使用utime函式來造假,它的前兩個引數是新的訪問時間和更改時間,後面接的事要修改的檔名列表,時間的格式採用的是內部的時間戳格式

"right now"是個很方便的時間戳值,time函式會以正確的格式返回這個值。所以,如果想修改當前目錄下所有的檔案,讓他們看起來是在一天前修改的,卻是在此刻被訪問的,只要這麼寫就可以了:
my $now = time;
my $ag0 = $now - 24 * 60 * 60; #一天的秒數
utime $now, $ag0, glob "*";

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245697/,如需轉載,請註明出處,否則將追究法律責任。

相關文章