查找和复制文件

sha*_*nuo 114 linux copy find

为什么以下不将文件复制到目标文件夹?

# 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'
Run Code Online (Sandbox Code Playgroud)

mal*_*pdx 256

如果您的目的是将找到的文件复制到/ home/shantanu/tosend,那么cp的参数顺序会反转:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;
Run Code Online (Sandbox Code Playgroud)

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

  • `\;`的目的是什么? (10认同)
  • @Astrid check [this](http://unix.stackexchange.com/questions/12902/how-to-run-find-exec) (4认同)
  • 如果结果路径中有空格,则不起作用。有什么建议吗? (2认同)
  • 在 Ubuntu 18 中,大括号也必须放在单引号中: find -iname '*.mp3' -mtime -1 -exec cp '{}' /home/my_path/ \; (2认同)

Thi*_*ATR 29

我遇到了类似这样的问题......

实际上,您可以通过两种方式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命令的一部分,应该在按下回车按钮之前进行转义.否则你会收到类似这样的错误

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

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

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 7

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

  • 如果像在最佳答案中那样提供完整的命令,则可以改进和缩短这个答案. (3认同)
  • 在linux中必须像这样指定目标目录:`find/home/shantanu/processed/-name'*2011*.xml'-exec cp --target-directory =/home/shantanu/tosend {} \;` (2认同)