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

Posted

技术标签:

【中文标题】如何在 unix 中移动或复制“find”命令列出的文件?【英文标题】:How to move or copy files listed by 'find' command in unix? 【发布时间】:2013-06-26 11:20:55 【问题描述】:

我有一个使用以下命令看到的某些文件的列表,但是如何将列出的这些文件复制到另一个文件夹中,比如 ~/test?

find . -mtime 1 -exec du -hc  +

【问题讨论】:

find . -mtime 1 -exec cp ~/test/ \; 另外,考虑通过管道连接到xargs。这样就可以批量复制文件了。 嘿,非常感谢你们俩 关于@EricJablow - 你是对的。但是,如果您在语句末尾使用+; 运行-exec,它将在一个批次中复制,如果您使用\;,它将为找到的每个文件运行cp 命令。干杯! Find and copy files的可能重复 【参考方案1】:

添加到 Eric Jablow 的答案,这是一个可能的解决方案(它对我有用 - linux mint 14 /nadia)

find /path/to/search/ -type f -name "glob-to-find-files" | xargs cp -t /target/path/

您也可以参考“How can I use xargs to copy files that have spaces and quotes in their names?”。

【讨论】:

-name 采用全局匹配,而不是正则表达式。一个重要的区别... 在复制大量文件的情况下,看起来 xargsexec 更有效。 Eduardo,如果您进行了任何基准测试,您能分享一下结果吗?【参考方案2】:

其实你可以通过两种方式处理复制命令中的find命令输出:

    如果find 命令的输出不包含任何空格,即如果文件名中不包含空格,那么您可以使用:

    Syntax:
        find <Path> <Conditions> | xargs cp -t <copy file path>
    Example:
        find -mtime -1 -type f | xargs cp -t inner/
    

    但是我们的生产数据文件可能包含空格,所以大多数时候这个命令是有效的:

    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。如何忽略这个?【参考方案3】:
find /PATH/TO/YOUR/FILES -name NAME.EXT -exec cp -rfp  /DST_DIR \;

【讨论】:

如果你想在当前目录中搜索,很酷的事情,你不必指定路径,只需使用点 (.) find 。 -name NAME.EXT -exec cp -rfp /DST_DIR \;【参考方案4】:

如果您使用的是 GNU 查找,

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

这与将输出通过管道传输到 xargs 一样有效,同时避免了这样做的缺陷(它可以处理嵌入的空格和换行符,而无需使用 find ... -print0 | xargs -0 ...)。

【讨论】:

【参考方案5】:

这对我来说是最好的方式:

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

【讨论】:

以上是关于如何在 unix 中移动或复制“find”命令列出的文件?的主要内容,如果未能解决你的问题,请参考以下文章

在Unix中递归列出文件中的所有文件? [复制]

UNIX 常用命令

UNIX命令,统计当前目录(含子目录)下所有后缀为.log的文件中ERROR出现的行数

如何在 Linux 中批量移动复制追加和重命名文件

列出包含字符串但 *NOT* 包含另一个字符串的文件的 Unix 命令

如何在 Perl 中使用带有管道的 Unix/AIX find 命令?