2013-05-20 31 views
34

我有大約50個左右的文件在我想推送到遠程服務器的各個子目錄中。我認爲rsync能夠使用--include-from選項爲我做到這一點。如果沒有--exclude =「*」選項,目錄中的所有文件都將被同步,而選項不包含任何文件。如何rsync只有一個特定的文件列表?

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run 

我正在運行它最初乾燥和0.0.0.0顯然被替換爲遠程服務器的IP。 rsync_include.txt的內容是一個新的以行分隔的我想上傳文件的相對路徑列表。

有沒有更好的方法來做到這一點,是星期一早上逃離我?

回答

1

你可能有一個更容易的時候,如果你正在尋找文件的具體名單,把他們直接在命令行上,而不是:但是

# rsync -avP -e ssh `cat deploy/rsync_include.txt` [email protected]:/var/www/ 

這是假設,你的列表ISN」 t只要命令行長度將會成爲問題並且rsync_include.txt文件僅包含真實路徑(即沒有評論,並且沒有正則表達式)。

+2

不幸的是,這不適用於大型列表或名稱中包含空格的文件。 –

+0

[參數列表太長] –

85

有一個標誌--files-from,正是你想要的。從man rsync

--files-from=FILE 

使用該選項允許你指定文件的確切名單轉移(從指定的文件中讀取或 - 標準輸入)。它還調整的rsync的默認行爲,使轉移只是指定的文件和目錄更容易:

  • 的--relative(-R)選項是隱含的,它保留是對每個項目指定的路徑信息該文件(如果您想關閉該文件,請使用--no-relative或--no-R)。

  • 隱含--dirs(-d)選項,它將創建在目標列表中指定的目錄,而不是通常跳過它們(使用--no-dirs或--no-d如果您想要把它關掉)。 --archive(-a)選項的行爲並不意味着--recursive(-r),因此如果需要,可以明確指定它。

  • 這些副作用會改變rsync的默認狀態,因此命令行上--files-from選項的位置與解析其他選項的方式無關(例如-a在之前的作用相同或after --files-from,就像--no-R和所有其他選項一樣)。

被從文件中讀取的文件名都是相對於源代碼目錄 - 任何領先的斜線被刪除,沒有「..」引用被允許去比源文件目錄較高。例如,利用這個命令:

rsync -a --files-from=/tmp/foo /usr remote:/backup 

如果/ tmp目錄/富包含字符串 「塊」(甚至 「/ BIN」),在/ usr/bin目錄將被放在/備份/ bin中創建遠程主機。如果它包含「bin /」(注意尾部斜線),那麼該目錄的直接內容也將被髮送(不需要在文件中明確提到 - 這從版本2.6.4開始)。在這兩種 情況下,如果啓用了-r選項,DIR的整個層次也將被轉移(請記住,-r需要與--files-從,因爲它不是由-a暗示明確指定)。還要注意的是,(默認啓用)--relative選項的作用是複製只從文件中讀取路徑信息 - 它 不會強制源規格的路徑複製(在/ usr在此情況下, )。

此外,如果您在文件前指定了「host:」(主機必須匹配傳輸的一端),則可以從遠程主機而不是本地主機讀取--files-from文件, 。作爲捷徑,您可以只指定「:」的前綴來表示「使用傳輸的遠程端」。例如:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy 

這將複製在位於遠程「SRC」主機上的/路徑/文件列表文件中指定的所有文件。

如果指定--iconv和--protect-args選項,並且從一個主機向另一個主機發送--files-from文件名,則文件名將從發送主機的字符集轉換爲接收主機的字符集。

注: - 從輸入--files排序中的文件的列表有助於rsync將是更有效的,因爲它會避免再次訪問該被相鄰條目之間共享的路徑元素。如果輸入未排序,某些路徑元素(隱含目錄)最終可能會被多次掃描,並且rsync最終將在 之後將其複製到文件列表元素中。

+6

注意,你還是要指定列出的文件所在的目錄,例如:'的rsync -av --files-從=文件列表。 target /'用於複製當前目錄中的文件。 –

+4

是的,並重申:'從FILE中讀取的文件名都是相對於源目錄。 – ash

+0

啊,錯過了,對不起! –

5

--files-from=如果要保持絕對路徑不變,參數需要尾隨斜線。所以,你的命令會成爲類似如下:

rsync -av --files-from=/path/to/file//tmp/ 

這可能像有大量的文件,並要將所有文件複製到X路徑來完成。所以你會發現這些文件並將輸出結果扔到如下文件中:

find /var/* -name *.log > file 
相關問題