为什么ls命令结合xargs和cp只移动10个文件?

时间:2012-10-19 17:43:48

标签: shell copy xargs

我有一个将文件从一个目录复制到另一个目录的命令

FILE_COLLECTOR_PATH="/var/www/";
FILE_BACKUP_PATH='/home/'
ls  $FILE_COLLECTOR_PATH | head -${1} |  xargs -i basename {} | xargs -t -i cp $FILE_COLLECTOR_PATH{} "${FILE_BACKUP_PATH}{}-`date +%F%H%M%S%N`"

我将它循环到shell脚本中,如

#!/bin/sh
SLEEP=120
FILE_COLLECTOR_PATH="/var/www/";
FILE_BACKUP_PATH='/home/'
while true
do
ls  $FILE_COLLECTOR_PATH | head -${1} |  xargs -i basename {} | xargs -t -i cp $FILE_COLLECTOR_PATH{} "${FILE_BACKUP_PATH}{}-`date   +%F%H%M%S%N`"
 sleep ${SLEEP}
done

但它似乎只移动了10个文件而不是所有文件,为什么?它应该假设移动所有文件。

2 个答案:

答案 0 :(得分:1)

尝试

ls -1

而不仅仅是ls,因为ls默认情况下taills -1时不显示每个文件的换行符({{1}}期望换行符)。

答案 1 :(得分:1)

一般来说,don't try to parse the output of ls in a script。您最终可能会遇到许多不同类型的细微问题。这项工作几乎总是有更好的工具。很多时候,这个工具是find。例如,要生成目录中所有文件的列表并对每个文件执行某些操作,您可以执行以下操作:

find <search directory> -maxdepth 1 -type f -print0 | xargs -0i basename {} ...

-print0-0参数允许findxargs以正确处理特殊字符(如空格)的方式传递文件名。

find命令还有其他选项,您可以在备份脚本中找到它们(这就是您正在构建的内容)。 -mmin-newer等选项将使您只能备份自上次迭代以来发生更改的文件。