我有一个将文件从一个目录复制到另一个目录的命令
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个文件而不是所有文件,为什么?它应该假设移动所有文件。
答案 0 :(得分:1)
尝试
ls -1
而不仅仅是ls
,因为ls
默认情况下tail
在ls -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
参数允许find
和xargs
以正确处理特殊字符(如空格)的方式传递文件名。
find
命令还有其他选项,您可以在备份脚本中找到它们(这就是您正在构建的内容)。 -mmin
和-newer
等选项将使您只能备份自上次迭代以来发生更改的文件。