2014-08-27 130 views
0

我有一個關於「cp」命令的問題: 我必須將文件夾複製到一個目錄。對我來說有兩種不同的情況。在第一種情況下具有相同名稱的文件夾不存在。到目前爲止,這很簡單:bash:用cp完全替換一個文件夾

ls test/folder1/ 
file1 file2 
ls test/destination/ 

cp -r -v test/folder1/ test/destination/ 
»test/folder1/「 -> »test/destination/folder1「 
»test/folder1/file1「 -> »test/destination/folder1/file1「 
»test/folder1/file2「 -> »test/destination/folder1/file2「 

在第二種情況下存在一個具有相同名稱的文件夾。這些文件具有與源文件夾中不同的名稱。我真正想要的是,目標目錄中的文件夾將被源文件夾完全替換(如果具有相同名稱的文件存在,則應該重寫;如果源目錄中不存在文件,則應刪除它們)。

ls test/folder1/ 
file1 file2 
ls test/destination/ 
folder1 
ls test/destination/folder1/ 
file3 file4 

cp -r -v test/folder1/ test/destination/ 
»test/folder1/file1「 -> »test/destination/folder1/file1「 
»test/folder1/file2「 -> »test/destination/folder1/file2「 


ls test/destination/folder1/ 
file1 file2 file3 file4 

它很可能是可能的類似

if [ -d destination/$foldername ] 
then 
rm -r /destination/$foldername 
cp-r -v test/$foldername/ test/destination/$foldername 
else 
cp-r -v test/$foldername/ test/destination/$foldername 
fi 

,但我不知道是否有更好的解決了這一點。

已經謝謝了!

+1

我認爲這是最好的。沒有更好的方案 – HuStmpHrrr 2014-08-27 13:53:40

+4

如果你不關心它,沒有必要先測試目的地。只需使用'rm -rf'test/destination/$ foldername「'然後'cp'。 – 2014-08-27 13:58:51

+0

@HuStmpHrrr,7行解決方案絕不比2行更好(無條件運行'rm -rf',擺脫'if')。 – 2014-08-27 15:01:15

回答

0

在你第二如果你想使用:

cp -av test/$foldername/* test/destination/$foldername 

這將複製內容test/$foldernametest/destination/$foldername覆蓋存在於test/destination/$foldername同名的任何文件。此外,保留任何(但願)空格$foldername你可以引用路徑/文件名,但不是*

cp -av "test/$foldername/"* "test/destination/$foldername" 
+0

不幸的是,在複製文件夾之後,這也將在目的地目錄的「舊」文件中仍然存在。 我想我必須使用rm -rf解決方案。我會檢查這個... 謝謝你! – user3780567 2014-08-27 17:36:43

+0

不 - 你是不正確的 - 或者我不明白。如果你想用新版本替換** **相同​​*名稱的文件**我的回答就是這樣** - 任何具有相同名稱的舊文件都被**覆蓋**。如果你想在複製之前徹底清除'test/destination/$ foldername'中的內容,可以使用'rm -f'。沒有與'test/$ foldername'中的名稱保持同名的舊文件... – 2014-08-27 18:39:22

+0

是的,也許這並不完全清楚我想要什麼。我想要「替換」整個文件夾(不僅僅是單個文件),因此一些文件(如果出現在前一個文件夾中,但不在新文件夾中)將被刪除。 rm -rf選項適用於我。 感謝您的幫助! – user3780567 2014-09-02 19:20:58

相關問題