File::Copy复制文件

File::Copy模块提供了copy函数和cp函数来复制文件,它们参数上完全一致,但行为上稍有区别。

用法大致如下:

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命令。

rename old_name,new_name;
rename old_name => new_name; # 列表环境下,逗号可用胖箭头替换

但需要注意,rename函数无法跨文件系统移动文件,因为它的底层仅仅只是重命名,修改文件inode中的数据。跨文件系统移动文件,实际上是复制文件再删除源文件,它会导致inode号码改变,rename的本质是基于inode的,无法实现这样的功能。

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交互的方式来取巧重命名:

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

递归复制/移动File::Copy::Recursive

具体内容暂缺,可看官方手册:File::Copy::Recursive

Perl复制、移动、重命名文件/目录的更多相关文章

  1. Python批量复制和重命名文件

    Python批量复制和重命名文件 示例代码 #! /usr/bin/env python # coding=utf-8 import os import shutil import time impo ...

  2. 【转】Linux 移动或重命名文件/目录-mv 的10个实用例子

    熟悉了 复制命令,下一个相关的命令就是 mv 命令.当你想要将文件从一个位置移动到另一个地方并且不想复制它,那么mv 命令是完成这个任务的首选. 初识 mv 命令 mv 命令是一个与cp类似的命令,但 ...

  3. Linux 移动或重命名文件/目录-mv 的10个实用例子

    本文导航 -初识 mv 命令03% -1.移动文件08% -2.移动多个文件15% -3.移动目录23% -4.重命名文件或目录27% -5. 重命名目录35% -6. 打印移动信息39% -7. 使 ...

  4. 【ANT】创建删除目录,复制移动重命名文件

    一.创建目录: <?xml version="1.0"?> <project default="test_mkdir"> <tar ...

  5. Web 在线文件管理器学习笔记与总结(13)重命名文件夹(14)复制文件夹

    (13)重命名文件夹 ① 重命名文件夹通过 rename($oldname,$newname) 实现 ② 检测文件夹名是否符合规范 ③ 检测当前目录中是否存在同名文件夹名称,如果不存在则重命名成功 i ...

  6. ASP FSO操作文件(复制文件、重命名文件、删除文件、替换字符串)

    ASP FSO操作文件(复制文件.重命名文件.删除文件.替换字符串)FSO的意思是FileSystemObject,即文件系统对象.FSO对象模型包含在Scripting 类型库 (Scrrun.Dl ...

  7. VC 复制移动删除重命名文件文件

    说明: 1.以下封装了4个函数_CopyFile,_DeleteFile,_MoveFile,_ReNameFile 2.每个函数都先拷贝了原来的路径,保证了路径是以2个\0\0结尾.(如果不以2个\ ...

  8. php 移动或重命名文件(图片)到另一目录下的方法有多种,这里只列出三种:

    php 移动或重命名文件(图片)到另一目录下的方法有多种,这里只列出三种:       方法一:使用copy函数   格式:copy(source,destination)   将文件从 source ...

  9. Web 在线文件管理器学习笔记与总结(7)重命名文件

    rename($oldname,$newname) 重命名文件或目录 <<<EOF EOF; 使用heredoc 技术,来部分实现界面与代码的准分离 重命名时,需要验证新文件名的合法 ...

随机推荐

  1. php签名认证

    一.概述 开年第一篇,该篇主要讲述了接口开发中,如何安全认证.如何用php签名认证. 二.说说历史 签名认证是什么?为什么要做签名认证?签名认证哪里会用到?no.no.no.....是不是,是不是,一 ...

  2. GitHub和Git(待补充)

    仓库(Repository):存放项目代码,每个项目对应一个仓库. 收藏(Star) 复制(Fork):克隆并生成新的仓库,from某某.以此为基础修改或应用项目.pull request,源仓库会查 ...

  3. noip第31课资料

  4. Linux更新源汇总-18.9.7更新

    企业站 阿里云:https://opsx.alibaba.com/mirror 网易:http://mirrors.163.com/ 教育站 北京理工大学:http://mirror.bit.edu. ...

  5. build.gradle

    1.将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法: 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = f ...

  6. 瞎搞poj1013

    http://poj.org/problem?id=1013 题意:给你标记从A到L的石子,其中有一个石子,可能会轻于其它石子,也可能重于其它石子.你只能通过三次天平的测量去找到这个石子.天平的三个状 ...

  7. Java并发编程:Lock(锁)

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...

  8. Openvswitch手册(7): Interfaces

    我们来看Interfaces ofport: OpenFlow port number for this interface. type: system: An ordinary network de ...

  9. 【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

    一.软件与硬件平台 软件平台: 操作系统:Windows 7 64-bit 开发套件:ISE14.7 硬件平台: FPGA型号:XC6SLX45-CSG324 QSPI Flash型号:W25Q128 ...

  10. map put值 使用匿名函数

    List<Map<String, Object>> list = setRoleMenuRlMapper.selectMapByParams(params); // Map m ...