Perl複製、移動、重命名文件/目錄

File::Copy複製文件

File::Copy模塊提供了copy函數和cp函數來複制文件,它們參數上徹底一致,但行爲上稍有區別。node

用法大體以下:shell

use File::Copy qw(copy cp);
    copy("sourcefile","destinationfile") or die "Copy failed: $!";
    copy("Copy.pm",\*STDOUT);
  • 兩個參數均可以是文件或文件句柄或者文件句柄通配,第一個參數指定源,第二個參數指定目標
    • 若是第一個參數是文件句柄,那麼將直接從文件句柄來讀取數據,若是這個參數是文件,那麼將打開這個文件來讀取數據
    • 第二個參數是數據的寫入目標
  • 若是目標文件不存在,但父目錄存在,則建立該目標文件,但若是父目錄也不存在,則報錯
  • 若是目標文件存在,則覆蓋該目標文件,不會給出任何提示
  • 若是目標是一個已存在的目錄,且源不是一個文件句柄,則拷貝到目標目錄中,若是源是一個文件句柄,將報錯
  • 源和目標不能是同一文件
  • 由於是拷貝操做,因此能夠跨文件系統拷貝
  • 第三個可選參數用於設置拷貝時的緩衝大小。對於文件來講,通常緩衝大小是整個文件(但最大2MB),對於不關聯實體文件的文件句柄(如套接字文件句柄),默認爲1K大小
  • cp能夠替換copy。它們的參數模式徹底一致,但cp會保留源文件的屬性,而copy則是採用目標文件的默認屬性。此外,cp在遇到權限錯誤的時候返回0,而無論文件是否成功拷貝
  • 強烈建議:若是能夠,都使用文件名而不是文件句柄。若是要使用文件句柄,則採用binmode模式的文件句柄,以避免丟失某些數據
  • File::Copy模塊沒法操做目錄,因此copy沒法複製目錄

例如,如今/mnt/g下建立一個文件t1.py。而後執行以下內容的perl程序:它將拷貝root下的t.py,而後再拷貝覆蓋到已存在的t1.py。函數

use File::Copy qw(copy cp);
copy "/root/t.py","/mnt/g/" or die "Can't copy file1: $!";
cp qw(/mnt/g/t.py /mnt/g/t1.py) or die "Can't copy file2: $!";

重命名/移動文件

rename函數能夠重命名文件,也能夠移動文件到其它目錄。功能相似於unix下的mv命令。unix

rename old_name,new_name;
rename old_name => new_name;   # 列表環境下,逗號可用胖箭頭替換

但須要注意,rename函數沒法跨文件系統移動文件,由於它的底層僅僅只是重命名,修改文件inode中的數據。跨文件系統移動文件,其實是複製文件再刪除源文件,它會致使inode號碼改變,rename的本質是基於inode的,沒法實現這樣的功能。code

rename "test2.log","test222.log"
    or die "Can't rename file1: $!";

rename "test222.log","/tmp/test223.log"
    or die "Can't rename file2: $!";

rename "/tmp/test223.log","/boot/test223.log"    # 本行將報錯
    or die "Can't rename file3: $!";

File::Copy模塊提供了move函數,它能夠跨文件系統移動文件。用法大體以下:遞歸

use File::Copy qw(move mv);
move("/dev1/sourcefile","/dev2/destinationfile");
mv("/dev1/sourcefile","/dev2/destinationfile");
mv("/dev1/sourcefile" => "/dev2/destinationfile");
  • File::Copy模塊沒法操做目錄,因此move沒法重命名或移動目錄
  • move有兩個參數,第一個是源,第二個是目標
  • 若是目標是個已存在的目錄,而源是個非目錄,則源將被移動到目標目錄內
  • 若是能夠,move在文件系統底層只是簡單地重命名文件。不然(例如跨文件系統),將copy源文件到目標,而後刪除源文件。若是這個copy+delete的過程當中失敗,則在目標路徑下會遺留一個可能還未拷貝完成的副本
  • move可使用mv替代

其實,能夠採用shell交互的方式來取巧重命名:get

rename(old,new) or system("mv",old,new);

遞歸複製/移動File::Copy::Recursive

具體內容暫缺,可看官方手冊:File::Copy::Recursiveio

相關文章
相關標籤/搜索