【问题标题】:BASH: Copy all files and directories into another directory in the same parent directoryBASH:将所有文件和目录复制到同一父目录中的另一个目录中
【发布时间】:2013-12-30 02:36:07
【问题描述】:

我正在尝试制作一个简单的脚本,将我的所有$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/ 之外的所有文件夹。我尝试使用extglobcp -r $HOME/!(Backup)/,但它没有复制我需要的隐藏文件。

【问题讨论】:

    标签: bash copy glob cp


    【解决方案1】:

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

    这是一个很好的参考

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

    【讨论】:

    • 我希望完全在 bash 中完成,但我会查看您的链接。
    【解决方案2】:

    雨果,

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

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

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

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

    【讨论】:

    • 所有内容都复制到备份目录后,我正在压缩存档。我有 shopt -s dotglob 以便 * 覆盖隐藏的点文件。我只需要一种方法从整个事情中排除那个目录,因为在备份本身中拥有用于备份的目录的副本是没有用的。
    【解决方案3】:

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

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

    【讨论】:

    • 我查看了你给我的 test && continue 行的语法,它似乎应该可以工作,但 bash 仍然给了我cp: cannot copy a directory into itself
    • 尝试在每个cp 命令之前打印$file 的值,以准确查看cp 的哪个参数导致了问题。
    • 打印$file 告诉我它没有跳过$HOME/Backup。我已经尝试从双括号更改为单括号并将其作为一个完整的 if 语句 if [ "$file" != "$backupdir" ]; then echo "$file" cp -r "$file" $backupdir fi 它的行为就像它甚至没有评估 if
    • $backupdir 的确切值是多少?由于这是一个字符串比较,$file$backupdir 都需要相同:相同的目录路径、相同的尾随 /(或缺少尾随 /)等。逻辑上表示相同的两个不同字符串路径仍然会比较不同。
    • 对不起,我花了这么长时间才回复。这就是问题所在。我有一个尾随/ 的$backupdir。谢谢。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多