2012-10-19 42 views
0

我有一個命令複製文件從一個目錄到另一個爲什麼ls命令與xargs和cp結合只能移動10個文件?

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個文件,而不是所有文件目錄,爲什麼?它應該假設移動所有文件。

回答

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之類的選項將使您僅備份自上次迭代以來發生更改的文件。

+0

感謝您的建議,我會盡量使用find –

1

嘗試做

ls -1 

,而不是僅僅ls,因爲ls默認做一個新行不顯示文件(tail期待新行),用於當ls -1確實每個文件。

+0

我試過了,但它仍然只複製一個循環的10個文件 –

+0

是的你是對的,我的錯誤現在正常工作 –

相關問題