BASH:将所有文件和目录复制到同一父目录中的另一个目录中

时间:2013-12-30 02:36:07

标签: bash copy glob cp

我尝试制作一个简单的脚本,将我的$HOME复制到$HOME中名为Backup/的另一个文件夹中。这包括所有隐藏文件和文件夹,并排除Backup/本身。我现在对复制部分的内容如下:

shopt -s dotglob

for file in $HOME/*
do
    cp -r $file $HOME/Backup/
done

Bash告诉我它无法将Backup/复制到自身中。但是,当我检查$HOME/Backup/的内容时,我发现$HOME/Backup/Backup/存在。

Backup/的副本本身没用。如何让bash复制除Backup/以外的所有文件夹。我尝试使用extglob并使用cp -r $HOME/!(Backup)/,但它并没有复制我需要的隐藏文件。

4 个答案:

答案 0 :(得分:3)

尝试rsync。你可以排除文件/目录。

这是一个很好的参考

http://www.maclife.com/article/columns/terminal_101_using_rsync_locally 

答案 1 :(得分:2)

雨果,

这样的剧本很好,但你可以试试这个:

cp -r *备份/; cp -r。*备份/;

备份使用的另一个工具是tar。这会压缩您的备份以节省磁盘空间。

另请注意,*不包括在内。隐藏文件。

答案 2 :(得分:1)

我同意使用rsync是更好的解决方案,但有一种简单的方法可以跳过bash中的目录:

for file in "$HOME/"*
do
    [[ $file = $HOME/Backup ]] && continue
    cp -r "$file" "$HOME/Backup/"
done

答案 3 :(得分:0)

这不能直接回答您的问题(其他答案已经这样做了),但是当您想使用cp进行备份时,请尝试cp -ua。这会复制目录,复制而不是跟随链接,保留权限,只有在文件比目标副本更新时才复制文件。