目的是复制过去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.
如何修复脚本?
答案 0 :(得分:3)
一个问题是,-ls
会在文件名旁边打印很多内容,并且会传递给cp
并且cp
会混淆。所以要做的第一件事就是停止使用-ls
。 (将来您可以使用set -x
来查看执行的内容,它可以帮助您调试此类问题。)
另一个问题是find
的输出可以包含空格和其他东西(想象一个名为$(rm -r *)
的文件),它不能简单地作为参数传递给cp
。
我看到三种不同的解决方案:
对find
使用单个-exec
命令:
find . -mmin -120 -exec cp {} /tmp/ \;
使用xargs
:
find . -mmin -120 -print0 | xargs -0 cp -t /tmp/
(请注意-t
与cp
的使用,以说明交换的参数。
Iterate over the output of find
:
while IFS='' read -r -d '' file
do
cp "${file}" /tmp/
done < <( find . -mmin -120 -print0 )
(警告:我没有测试过上述任何一项。)
答案 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/ \;