cp dir递归排除2个子目录

时间:2012-02-27 12:05:32

标签: linux bash unix cp

我有1个目录,包含9个子目录和10个文件。 子目录具有下一级子目录和文件。

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

我想复制所有子目录和文件,不包括:

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

最好的方法是什么?

7 个答案:

答案 0 :(得分:28)

rsync -avz --exclude subdirectory5 --exclude subdirectory7 /home/directory/ target-path

答案 1 :(得分:10)

我不知道使用cp做到这一点的好方法,但使用rsync--exclude切换相当容易。

答案 2 :(得分:8)

也许find命令可以帮助你:

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

答案 3 :(得分:2)

使用rsync--exclude更好

答案 4 :(得分:2)

您可以使用--exclude的{​​{1}}选项:

tar

答案 5 :(得分:2)

为什么不直接使用cp命令:

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

答案 6 :(得分:1)

Kev的方式更好,但这也有效:

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以执行命令。

<一个很大的免责声明就在这里>

你应该Kev的解决方案更好