查找和复制文件


128

为什么以下内容没有将文件复制到目标文件夹?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'

Answers:


273

如果您打算将找到的文件复制到/ home / shantanu / tosend中,则可以将cp的参数顺序颠倒过来:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

注意:find命令使用{}作为匹配文件的占位符


14
目的是\;什么?
阿斯特丽德

5
@Astrid检查
shellbye

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;这个命令有什么问题吗?它无法正常工作
凌晨

2
如果结果路径中有空格,则不起作用。有什么建议吗?
TheJeff

1
在Ubuntu 18中,花括号也必须用单引号引起来:find -iname'* .mp3'-mtime -1 -exec cp'{}'/ home / my_path / \;
p6majo

32

我遇到这样的问题...

实际上,您可以通过两种方式findcopy命令中处理命令输出

  1. 如果find命令的输出不包含任何空格,即如果文件名中不包含空格,则可以使用下面提到的命令:

    句法: find <Path> <Conditions> | xargs cp -t <copy file path>

    例: find -mtime -1 -type f | xargs cp -t inner/

  2. 但是大多数时候,我们的生产数据文件中可能包含空间。因此,以下提到的命令中的大多数时间都更安全:

    句法: find <path> <condition> -exec cp '{}' <copy path> \;

    find -mtime -1 -type f -exec cp '{}' inner/ \;

在第二个示例中,最后一部分(即分号)也被视为find命令的一部分,应在按Enter键之前将其转义。否则你会得到这样的错误

find: missing argument to `-exec'

在您的情况下,为了将查找文件复制到中,复制命令语法是错误的/home/shantanu/tosend。以下命令将起作用:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;

3.如果您有GNU find/ xargsfind <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>。范例:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight

7

您需要使用cp -t /home/shantanu/tosend来告诉它参数是目标目录而不是源。然后,您可以将其更改为-exec ... +以便cp一次复制尽可能多的文件。


2
在Linux中,必须这样指定目标目录: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
如果像最上面的答案一样提供了完整的命令,则可以改善和缩短该答案。
布莱恩(Brian)


-2

该错误的原因是您正在尝试将还需要-r选项的文件夹复制到cp。


3
嗨,由于问题已经回答了(一段时间后),这实际上不是一个相关的答案,它也应该是一个注释(当您有更多代表时),除非您想扩展和解释它。只是一个提示:)。
W1ll1amvl 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.