2011-09-20 19:35:37 quick_isbest 阅读数 7037
如: find 路径 -name "*.c" -exec cp {} 目标目录 \;
2016-07-04 10:27:04 qq_33442549 阅读数 3378
  1. 命令格式

    cp [OPTION]... [-T] SOURCE DEST
    cp [OPTION]... SOURCE... DIRECTORY
    cp [OPTION]... -t DIRECTORY SOURCE...

  2. 命令说明

    1. cp命令用来复制文件或者目录,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。这说明命令行和shell脚本的执行方式有些不同。
    2. cp file1 file2 file3
      对于cp命令,只有最后一个是目标,此前所有的全部是源,也就意味它是不允许一个源多个目标或者 多个源多个目标,上述只有file3是目标,file1和2是源。
    3. cp使用情况
      # cp etc/passwd  /tmp/  将etc下的passwd文件复制到tmp目录下,保持原名称passwd
      # cp etc/passwd  /tmp/test    如果test不存在,将passwd复制到tmp下并重命名为test;如果test是目录,将etc下的passwd文件复制到test目录下,保持原名称passwd;如果test是文件,询问是否覆盖,是就意味着把原来的test文件删除,把passwd复制到目录下并重命名为test。
      # cp etc/passwd1 etc/passwd2 etc/passwd3 /tmp/test  复制多个文件的时候,目标必须是个存在的目录,否则复制将无法进行
      # cp -r dir1 dir2  当使用 -r 选项递归复制一个目录的时候,如果目标目录不存在,则会把源复制过来并重命名为源的名字;如果目标存在且是个目录,则是把源复制到该目录下并保持原目录名;如果目标存在,但是个文件,则无法完成复制。
    4. 如果复制的是一个链接,则会复制链接指向的那个文件,而不是链接本身。

  3. 常用参数

    -a 或 --archive     此参数的效果和同时指定"-dpR"参数相同

    -b 或 --backup      删除、覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源

    文件或目录。假如没有加上这个参数,在复制过程中若遇到符号链接,则会直接复制源文件或目录

    -f 或 --force       强行复制文件或目录, 不论目的文件或目录是否已经存在

    -i 或 --interactive 覆盖文件之前先询问用户

    -l 或 --link        对源文件建立硬链接,而非复制文件

    -p 或 --preserve    保留源文件或目录的属性,包括所有者、所属组、权限与时间

    -P 或 --parents     保留源文件或目录的路径,此路径可以是绝对路径或相对路径,且目的目录必须已经丰在

    -r     递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为

    普通文件处理

    -R 或 --recursive   递归处理,将指定目录下的文件及子目录一并处理

    -s 或 --symbolic-link  对源文件建立符号链接,而非复制文件

    -S <备份字尾字符串> 或 --suffix=<备份字尾字符串> 用"-b"参数备份目的文件后,备份文件的字尾会被加上一个备份字

    符串。默认的备份字尾符串是符号"~"

    -u 或 --update      使用这项参数之后,只会在源文件的修改时间(Modification Time)较目的文件更新时,或是名称相

    互对应的目的文件并不存在,才复制文件

    -v 或 --verbose     显示执行过程

    -V <备份方式> 或 --version-control=<备份方式>  指定当备份文件时,备份文件名的命名方式,有以下3种:

           1.numbered或t, 将使用备份编号,会在字尾加上~1~字符串,其数字编号依次递增

           2.simple或never 将使用简单备份,默认的备份字尾字符串是~, 也可通过-S来指

           3.existing或nil将使用当前方式,程序会先检查是否存在着备份编号,若有则采用备份编号,若无则采用简单备份

    -x 或 --one-file-system  复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不复制,亦不处理位于其他分区的文件

    --help              显示在线帮助

    --sparse=<使用时机>  设置保存希疏文件的时机

    --version           显示版本

  4. 使用示例(来自codingstandards的博客

  1. 复制单个文件

    [root@jfht ~]# ls >ls0.txt
    [root@jfht ~]# ls -l ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:41 ls0.txt

    等待两分钟再操作。因为同一分钟看不出效果。
    [root@jfht ~]# cp ls0.txt ls1.txt
    [root@jfht ~]# ls -l ls0.txt ls1.txt
    -rw-r--r-- 1 root root 213 10-18 20:41 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:43 ls1.txt

    在没有带-a参数时,两个文件的时间是不一样的。
    [root@jfht ~]# cp -a ls0.txt ls2.txt
    [root@jfht ~]# ls -l ls0.txt ls2.txt
    -rw-r--r-- 1 root root 213 10-18 20:41 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:41 ls2.txt

    在带了-a参数时,两个文件的时间是一致的。
    [root@jfht ~]# cp ls0.txt ls2.txt
    cp:是否覆盖“ls2.txt”? n

    目标文件存在时,会询问是否覆盖。这是因为cp是cp -i的别名。
    [root@jfht ~]# cp -f ls0.txt ls2.txt
    cp:是否覆盖“ls2.txt”? n

    目标文件存在时,即使加了-f标志,也还会询问是否覆盖。
    [root@jfht ~]# command cp ls0.txt ls2.txt

    使用command命令执行cp时,就不会执行cp别名了,而是直接执行cp外部命令。
    [root@jfht ~]# ls -l ls0.txt ls2.txt
    -rw-r--r-- 1 root root 213 10-18 20:41 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:48 ls2.txt

    [root@jfht ~]# cp ls0.txt ls0.txt
    cp: “ls0.txt” 及 “ls0.txt” 为同一文件
    [root@jfht ~]# cp -f ls0.txt ls0.txt
    cp: “ls0.txt” 及 “ls0.txt” 为同一文件

    如果目标文件就是源文件,那么无论加不加-f标志,都是不会覆盖的。

  2. 复制文件到目录
    [root@jfht ~]# mkdir tmp
    [root@jfht ~]# cp ls0.txt tmp
    [root@jfht ~]# cp -a ls1.txt tmp
    [root@jfht ~]# cp -a ls1.txt ls2.txt tmp
    cp:是否覆盖“tmp/ls1.txt”? n
    [root@jfht ~]# ls -l ls?.txt tmp/ls?.txt
    -rw-r--r-- 1 root root 213 10-18 20:41 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:43 ls1.txt
    -rw-r--r-- 1 root root 213 10-18 20:48 ls2.txt
    -rw-r--r-- 1 root root 213 10-18 21:02 tmp/ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:43 tmp/ls1.txt
    -rw-r--r-- 1 root root 213 10-18 20:48 tmp/ls2.txt
    [root@jfht ~]#

  3. 复制整个目录

    [root@jfht ~]# cp tmp tmp1
    cp: 略过目录 “tmp”
    [root@jfht ~]# cp -a tmp tmp1
    [root@jfht ~]# ls tmp tmp1
    tmp:
    ls0.txt  ls1.txt  ls2.txt

    tmp1:
    ls0.txt  ls1.txt  ls2.txt
    [root@jfht ~]# ls -l tmp tmp1
    tmp:
    总计 24
    -rw-r--r-- 1 root root 213 10-18 21:02 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:43 ls1.txt
    -rw-r--r-- 1 root root 213 10-18 20:48 ls2.txt

    tmp1:
    总计 24
    -rw-r--r-- 1 root root 213 10-18 21:02 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:43 ls1.txt
    -rw-r--r-- 1 root root 213 10-18 20:48 ls2.txt
    [root@jfht ~]#

    [root@jfht ~]# cp -a tmp tmp1
    [root@jfht ~]# ls -l tmp tmp1
    tmp:
    总计 24
    -rw-r--r-- 1 root root 213 10-18 21:02 ls0.txt
    -rw-r--r-- 1 root root 213 10-18 20:43 ls1.txt
    -rw-r--r-- 1 root root 213 10-18 20:48 ls2.txt

    tmp1:
    总计 32
    -rw-r--r-- 1 root root  213 10-18 21:02 ls0.txt
    -rw-r--r-- 1 root root  213 10-18 20:43 ls1.txt
    -rw-r--r-- 1 root root  213 10-18 20:48 ls2.txt
    drwxr-xr-x 2 root root 4096 10-18 21:03 tmp
    [root@jfht ~]#

    注意目标目录存在与否结果是不一样的。目标目录存在时,整个源目录被复制到目标目录里面。

  4. 将光盘复制成光盘映像文件(iso文件)

    把要复制的光盘放在光驱中,注意不需要将/dev/cdrom设备mount上来。

    [root@localhost data] cp /dev/cdrom disk1.iso

    [root@localhost data] ls -l disk1.iso

    -rw-r-----      1    root     root      655392768      10月  18   19:48   disk1.iso

    [root@localhost data]

    注意:需要好几分钟时间。

  5. linux命令目录

2018-10-11 22:06:49 qq_42321328 阅读数 2717

关于 find 和 cp 连用

提起find 就得说下它的好基友 xargs

xargs 是解决有些命令不能用
“|” 传递结果如下题:

把 /bata 目录下,以“.txt” 结尾的普通文件,拷贝到/grk下

看到这个题我们会想到先把 /bata 下以 .txt 结尾的普通文件查找出来
#find /data/ -type f
-name “*.txt”

然后用“|”传递给cp 最后命令就是

find /data/ -type f -name

“*.txt” | cp /grk

乍一看没什么毛病,我们来执行一下

在这里插入图片描述

好吧报错,那我们加上 -t -f 指定并强制试试
在这里插入图片描述

还是错的在这里插入图片描述

好吧这是因为find 命令输出的结果是无法被 “|”
传递的,或者说 find 命令输出的结果被“|”传递后无法被“|”之后的 cp 捕获,这个时候就用到了 xargs 。 它的作用是捕获一个“|”前命令的输出,然后传递给下一个命令,这样的话上题的命令就变成了

#find /data/ -type f -name
“*.txt” |xargs cp -t /grk

这里的-t参数是指定目标目录不可省略

来我们执行一下

在这里插入图片描述

成功! 在这里插入图片描述

xargs 有一个参数 -i 可以把捕获的结果放入{}中,感觉这样更符合我们常用的语法,上题命令应该这样写:

find /data/ -type f -name

“*.txt” | xargs -i cp {} /grk/

执行一下:
在这里插入图片描述

我们再来试一下第二种方法 用 $ 存放( )里命令执行的命令结果,对于上题我们的命令写出来应该是这样:

cp $(find /data/ -type f -name

“*.txt”) /grk

执行
在这里插入图片描述
在这里插入图片描述

个人一直用这个因为感觉好记

最后还有一种方法
# find /data/ -type f -name"*.txt" -exec cp {} /grk/ ;
来我们试试
在这里插入图片描述

这种语法我不知道如何解释。就是知道这么用而已

那关于find和cp就介绍到这里了

2019-01-09 11:12:14 guo_qiangqiang 阅读数 488

我们常用find的查询文件,查询之后,会做一些常用的操作,比如删除rm -rf ,这个时候,又不想用管道符,那么用exec就可以解决这个问题。

exec解释:

-exec 参数后面跟的是 command 命令,如rm -f,它的终止是以;分号为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

{} 花括号代表前面find查找出来的文件名。

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find 查找,很方便的。在有些操作系统中,只允许 -exec 选项执行诸如 ls 或 ls -l 这样的命令。大多数用户使用着一些选项是为了查找旧文件并删除它们。建议再真正执行 rm 命令删除文件之前,最好先用 ls 命令看一下,确认他们是所要删除的文件。 exec 选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号。为了使用 exec 选项,必须要同时使用 print 选项。如果验证一下 find 命令,会发现该命令只输出从当前路径起的相对路径及文件名。

实例1:ls -l 命令放在 find 命令的 -exec 选项中

1、命令:
find . -type f -exec ls -l {} ;   find 命令匹配到了当前目录下的所有普通文件,并在 -exec 选项中使用 ls -l 命令将它们列出。

这个命令有点坑,不过确实很好用,说它坑是因为我输入的时候 收到提示:find 遗漏 -exec 的参数

2、解决:
(1)、注意 是一对儿{},一个空格和一个\,最后是一个分号
(2)、在 ; 使用 “;” ‘;’ 这样把它们引起来。

实例2:在目录中查找更改时间在n 日以前的文件并删除它们

1、命令:

find . -type f -mtime +14 -exec rm {} ;

在 shell 中用任何方式删除文件之前,应当先查看相应的文件,一定要小心,当使用诸如 mv 或 rm 命令时,  
可以使用-exec 选项的安全模式,他将对每个匹配到的文件进行操作之前提示你。

实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示

1、命令:

find . -name “*.log” -mtime +5 -ok rm {} ;

查找当前目录中所有以 .log 结尾的,更改时间在 5 日以上的文件,并删除它们,并且在删除之前先给出提示。按y 键确定,n 键 取消。

实例4: -exec 中使用 grep 命令

1、命令:

find /etc -name “passwd” -exec grep “root” {} ;

任何形式的命令都可以在 -exec 选项中使用。 在上面的例子中我们使用 grep 命令。find命令首先匹配所有文件名为“passwd”的文件,然后执行 grep 命令查看这些文件中是否存在一个 root 用户。

实例5:查找文件并移动到指定目录

1、命令:

find . -name “*.log” -exec mv {} … ;    //… 是路径名

实例6:用exec选项执行 cp 命令

1、命令:

find . -name “*.log” -exec cp {} test3 ;

一不小心又中招了,test3 是个目录,不然cp 不进去。

2009-08-20 11:42:00 telephone518 阅读数 39

find /etc -type f -name '*.conf' -exec cp {} /Documents/ \;

---查找/etc目录下 扩展名为conf的文件,将查找到的文件 拷贝到 /Documents/ 目录下。注意命令最后的"\;",并且“\"”前必须有一个空格; {} 表示查到的文件

Linux

阅读数 3313

linux find命令

阅读数 308

Linux 命令Find

阅读数 2

没有更多推荐了,返回首页