0

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

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 个文件而不是目录中的所有文件,为什么?它应该假设移动所有文件。

4

2 回答 2

1

尝试做

ls -1

而不是 just ls,因为ls默认情况下不会在tail每个文件的换行符(期望换行符)上显示文件ls -1

于 2012-10-19T17:44:37.777 回答
1

一般来说,不要尝试解析ls脚本中的输出。您最终可能会遇到许多不同类型的微妙问题。几乎总是有更好的工具来完成这项工作。很多时候,这个工具是find. 例如,要生成目录中所有文件的列表并对每个文件执行某些操作,您可以执行以下操作:

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

-print0and-0参数允许find并以正确处理特殊字符(如空格)的xargs方式传达文件名。

find命令还有其他选项,您可能会在备份脚本中发现这些选项(这就是您正在构建的内容)。-mmin和之类的选项-newer将使您能够仅备份自上次迭代以来已更改的文件。

于 2012-10-19T18:07:13.863 回答