2008-12-12 72 views
2

我想知道是否可以根據源名稱將文件複製/移動到目的地。bash腳本。複製文件而不覆蓋

基本上,我有一個/郵件文件夾,其中有幾個子文件夾,如cur和new等等。然後我在/ mail/home /用戶名中提取了一個備份。 mv -f將不起作用,因爲我沒有權限覆蓋目錄,但只有其中的文件。

我得到的錯誤,如MV:不能覆蓋目錄`/home/username/mail/username.com」

我想要做的就是在目錄username.com每個文件,將其移動到郵件中的同名文件夾。可以有任意數量的文件夾來代替username.com,並有獨立的子目錄。

這樣做的最好方法是什麼?

我必須這樣做,因爲我只能使用ftp和bash訪問我的主機。

編輯:澄清

我想我需要澄清所發生的事情。我在共享主機上,顯然沒有對目錄本身的寫入權限。至少主要的如mail和public_html。我用tar做了一個〜/ mail的備份,但是當試圖將它解壓縮到〜/ mail/home/mail等時,我忘記了完整的路徑。現在,我不能簡單地解壓縮,因爲路徑是錯誤的,我不能mv -f,因爲我只能訪問文件而不是目錄。

回答

2

複印時,您應考慮在 '及格' 模式下使用cpio-p):

cd /mail; find . -type f | cpio -pvdmB /home/username/mail 

-v是冗長; -d根據需要創建目錄; -m保留文件的修改時間; -B意味着使用更大的塊大小,並且在此可能無關緊要(它在與磁帶設備搞混時曾經有所不同)。從此列表中省略的是-u標誌,它會執行無條件複製,覆蓋目標區域中的預先存在的文件。命令cd確保路徑名稱正確;如果你只是做:

find /mail -type f | cpio -pvdmB /home/username 

你會得到相同的結果,但只有巧合 - 因爲/home/username下的子目錄是一樣的原始的絕對路徑。如果你需要做的:

find /var/spool/mail -type f | cpio -pvdmB /home/username/mail 

然後複製的文件將被/home/username/mail/var/spool/mail下找到,這是不太可能,你腦子裏想的是什麼。

可以實現與(GNU)類似的效果tar

(cd /mail; tar -cf - .) | (cd /home/username/mail; tar -xf -) 

此副本的目錄,而不僅僅是文件。要做到這一點,你需要GNU-只設施:

(cd /mail; find . -type f | tar -cf - -F -) | (cd /home/username/mail; tar -xf -) 

的首張個人破折號意味着「寫入stdout」;第二種方法是「從標準輸入讀取」; '-F'選項表示'讀取文件名以從指定文件複製'。

0

我不是它是什麼,你想做的事完全清楚,但你可以嘗試以下方法:

for file in /mail/*; do 
    mv -f $file /home/username/mail/$(basename $file) 
done 

這將每個文件和子目錄中移動/郵件從那裏進入/家/用戶名/郵件。

+0

我認爲這與我想要做的相反?我提取了一個郵件存檔到郵件文件夾中,但是它創建了郵件下的一個子目錄,我現在無法恢復,因爲我無法覆蓋原始目錄 – 2008-12-12 16:29:38

0

是否使用tar選項?你可以tar上的目錄,並提取它/mail/(因爲我假設這是你想粗略)與tar覆蓋現有的文件和目錄。

+0

這就是我試過的,問題是我只能覆蓋文件,而不是目錄 – 2008-12-12 16:44:21

0

我對你想要做的事情有點困惑。但是,您應該能夠使用Adam解決方案的方法並將錯誤重定向到文件。

for file in /mail/*; do 
    mv -f $file /home/username/mail/$(basename $file) 2> /tmp/mailbackup.username.errors 
done 

模塊將不會被覆蓋,您可以檢查文件,以便它只包含您預期的錯誤。

+0

問題是我無法覆蓋目錄,只有文件和我的郵件存檔目前位於郵件的subdirectoy中。使用普通工具恢復它似乎是不可能的。 – 2008-12-12 16:45:19

+0

是的,但我認爲如果你嘗試類似於我所建議的那樣,將會移動所有文件,並且npt能夠覆蓋目錄的所有錯誤消息都將被重定向到日誌文件。 – PEZ 2008-12-13 07:35:37

0

你能再次解開它嗎? tar的-P選項不會剝去前導「/」,所以絕對路徑名將受到尊重。從你的編輯中,這聽起來像會解決它。

+0

我試過了,它給出了錯誤:tar:/ home/username/mail:在用tar tar xzvfP〜/ new/moremail.tgz〜/ mail – 2008-12-12 17:16:16

0

即使有你的澄清,我仍然有一個問題,你完全明白你在做什麼。但是,有什麼機會可以使用rsync? src和dest主機可以是rsync的同一主機。我記得,你可以告訴rsync只更新已經存在於目標區域(--existing)的文件,也可以忽略目錄更改(--omit-dir-times)。

同樣,我不太瞭解您的需求,但rsync在備份文件和目錄方面非常靈活。

祝你好運。