2012-02-27 29 views
8

我有1個目錄有9個子目錄和10個文件。 子目錄有下一級子目錄和文件。cp dir recursivly不包括2個子目錄

/home/directory/ 
/home/directory/subdirectory1 
/home/directory/subdirectory2 
... 
/home/directory/subdirectory9 
/home/directory/file1 
... 
/home/directory/file10 

我想複製所有子目錄和文件recursivly排除:

/home/directory/subdirectory5 
/home/directory/subdirectory7 

什麼是它的最佳方式?

+0

第一拷貝完整文件夾遞歸地,然後使用rm命令刪除子文件夾5和7 – Pradeep 2012-02-27 12:39:59

+0

可能重複的[遞歸複製文件夾中,不包括一些文件夾](HTTP://計算器。 com/questions/2193584/copy-folder-recursively -exhibit-some-folders) – 2014-06-27 08:06:58

回答

8

也許find命令將幫助您:

$ find /home/directory -mindepth 1 -maxdepth 1 -name 'subdirectory[57]' -or -exec cp -r {} /path/to/dir \; 
+1

這不會保留目錄樹結構,@kjohri的rsync回答要好得多 – arod 2015-03-17 19:06:02

+0

這個命令甚至不爲我工作,它說-exec缺少一個參數 – zozelfelfo 2017-01-17 12:28:37

8

我不知道用cp這樣做的好方法,但使用rsync--exclude開關很容易。

1

千電子伏的方式是更好的,但是這也將工作:

find "/home/folder" -maxdepth 1 | sed -e "/^\/home\/folder$/d" -e "/^\/home\/folder\/subfolder5$/d" -e "/^\/home\/folder\/subfolder7$/d" -e "s/^/cp \-r /" -e "s/$/ \/home\/target/" | cat 

解釋:

find "/home/folder" -maxdepth 1 | 
// get all files and dirs under /home/folder, pipe output 

sed -e "/^\/home\/folder$/d" 
// have sed strip the path being searched, or the cp -r we prepend later will pickup the excluded dirs again. 

-e "/^\/home\/folder\/subfolder5$/d" 
// have sed strip subfolder5 

-e "/^\/home\/folder\/subfolder7$/d" 
// have sed strip subfolder7 

-e "s/^/cp \-r /" 
// have sed prepend "cp -r " to each line 

-e "s/$/ \/home\/target/" | cat 
// have sed append targetdir to each line. 

輸出:

cp -r /home/folder/subfolder9 /home/target 
cp -r /home/folder/subfolder1 /home/target 
cp -r /home/folder/file10 /home/target 
cp -r /home/folder/subfolder2 /home/target 
cp -r /home/folder/file1 /home/target 
cp -r /home/folder/subfolder3 /home/target 

更改| cat| sh執行該命令。

<一個很大的聲明放在這裏>

你應該千電子伏的解決方案是更好的

+0

+1用於過度複雜的sed管道傳輸到cat或sh-建立其他複雜腳本的最佳方式。 +1在這種情況下Kev的正確答案:) – 2012-02-27 13:31:41

2

使用rsync--exclude更好

+0

rsync是一種更好的方法。 – 2013-05-22 06:12:06

2

可以使用--exclude選項tar

{ cd /home/directory; tar -c --exclude=subdirectory5 --exclude=subdirectory7 .; } | { cd _destination_ ; tar -x; } 
1

爲什麼不使用cp命令是這樣的:

cp -r /home/directory/!(subdirectory5|subdirectory7) /destination 
+2

不在bash中工作!輸出爲「bash:!:event not found」 – 2013-05-03 01:53:52

+1

在這種情況下,您應該設置調用:** shopt -s extglob **和** mkdir destination **。然後它會工作。 – shadox 2014-09-22 10:55:35

27
rsync -avz --exclude subdirectory5 --exclude subdirectory7 /home/directory/ target-path 
+0

rsync是要走的路。忘記CP – thebugfinder 2015-08-28 07:55:37