如何在Unix中移动或复制由“find”命令列出的文件?

56

我有一份文件列表,可以通过以下命令查看。但是,如何将列出的这些文件复制到另一个文件夹中,例如~/test?

find . -mtime 1 -exec du -hc {} +

9
搜索当前目录下在1天内被修改的文件,并将其复制到~/test/目录下。 - user529758
3
考虑使用管道命令xargs。这样,您就可以分批复制文件。 - Eric Jablow
关于@EricJablow的问题,你是正确的。但是如果你在语句末尾使用+;运行-exec命令,它将会批量复制文件,而如果你使用\;,它将会为每个找到的文件运行一个cp命令。干杯! - domdambrogia
1
可能是查找并复制文件的重复内容。 - tripleee
5个回答

80

7
-name 使用通配符匹配,而非正则表达式。这是一个重要的区别... - sanmiguel
1
在需要复制大量文件的情况下,xargs似乎比exec更有效率。 - Eduardo B.
1
Eduardo,你可以分享一下结果吗?如果你已经完成了任何基准测试的话。 - Ankur

31

事实上,您可以以两种方式在复制命令中处理find命令的输出:

  1. If the find command's output doesn't contain any space, i.e if the filename doesn't contain a space in it, then you can use:

    Syntax:
        find <Path> <Conditions> | xargs cp -t <copy file path>
    Example:
        find -mtime -1 -type f | xargs cp -t inner/
    
  2. But our production data files might contain spaces, so most of time this command is effective:

    Syntax:
       find <path> <condition> -exec cp '{}' <copy path> \;
    
    Example 
       find -mtime -1 -type f -exec cp '{}' inner/ \;
    
在第二个例子中,最后一部分的分号也被认为是find命令的一部分,在按下Enter之前应该进行转义。否则会出现类似以下的错误:
find: missing argument to `-exec'

如果找不到文件,cp命令会抛出错误:cp: missing file operand。如何忽略这个错误? - Lei Yang

20
find /PATH/TO/YOUR/FILES -name NAME.EXT -exec cp -rfp {} /DST_DIR \;

如果您想在当前目录中搜索,酷的地方在于,您无需指定路径,只需使用点(.)即可。使用如下命令:find . -name NAME.EXT -exec cp -rfp {} /DST_DIR ; - Laith Leo Alobaidy

6

如果您正在使用GNU find命令,

find . -mtime 1 -exec cp -t ~/test/ {} +

这种方法与将输出传递给 xargs 的效果一样,同时避免了这样做的陷阱(它可以处理嵌入空格和换行符,而不必使用 find ... -print0 | xargs -0 ...)。


-2

这是我最好的方式:

cat filename.tsv  |
    while read FILENAME
    do
    sudo find /PATH_FROM/  -name "$FILENAME" -maxdepth 4 -exec cp '{}' /PATH_TO/ \; ;
    done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接