列出文件并将其复制到unix中

时间:2015-03-26 15:04:30

标签: linux bash

目的是复制过去2小时内生成的文件。这是一个小脚本:

a=`find . -mmin -120 -ls` 
cp $a /tmp/

echo $a 
401 1 drwxr-x--- 2 oracle oinstall 1024 Mar 26 11:00 . 61 
5953 -rw-r----- 1 oracle oinstall 6095360 Mar 26 11:00 ./file1
5953 -rw-r----- 1 oracle oinstall 6095360 Mar 26 11:00 ./file2

我收到以下错误:

cp: invalid option -- 'w'
Try `cp --help' for more information.

如何修复脚本?

3 个答案:

答案 0 :(得分:3)

一个问题是,-ls会在文件名旁边打印很多内容,并且会传递给cp并且cp会混淆。所以要做的第一件事就是停止使用-ls。 (将来您可以使用set -x来查看执行的内容,它可以帮助您调试此类问题。)

另一个问题是find的输出可以包含空格和其他东西(想象一个名为$(rm -r *)的文件),它不能简单地作为参数传递给cp

我看到三种不同的解决方案:

  1. find使用单个-exec命令:

    find . -mmin -120 -exec cp {} /tmp/ \;
    
  2. 使用xargs

    find . -mmin -120 -print0 | xargs -0 cp -t /tmp/
    

    (请注意-tcp的使用,以说明交换的参数。

  3. Iterate over the output of find

    while IFS='' read -r -d '' file
    do
      cp "${file}" /tmp/
    done < <( find . -mmin -120 -print0 )
    
  4. (警告:我没有测试过上述任何一项。)

答案 1 :(得分:2)

-ls给你ls样式输出。尝试删除它,你应该只获得文件的相对路径,它应该更像你想要的。或者看看Biffen对你的问题的评论,这似乎是我会采取的方法。

答案 2 :(得分:0)

您所要做的就是只提取文件名。因此,将find命令更改为以下内容:

    a=`find . -mmin  -120 -type f`
    cp $a /tmp/

以上find命令仅捕获文件,并仅查找最近120分钟内修改过的文件。或者使用下面的单个查找命令来执行此操作:

find . -mmin -120 -type f -exec cp '{}' /tmp/ \;