【问题标题】:Git bash `cp` – Exclude "protected operating system files" (and what are those?)Git bash `cp` - 排除“受保护的操作系统文件”(那些是什么?)
【发布时间】:2013-02-10 22:07:36
【问题描述】:

如果我尝试在 Git bash(在 Windows 7 上)中使用 cp 复制我的主目录,则会复制超出我想要的内容。下面是一个示例来演示这个问题。实际上我想递归地复制,但在这个例子中我并没有加快速度。

Simon@SIMONS-DATOR ~
$ mkdir /c/test

Simon@SIMONS-DATOR ~
$ cp ./* /c/test
cp: omitting directory `./AppData'
cp: omitting directory `./Contacts'
cp: omitting directory `./Cookies'
cp: omitting directory `./Desktop'
cp: omitting directory `./Documents'
cp: omitting directory `./Downloads'
cp: omitting directory `./Dropbox'
cp: omitting directory `./Favorites'
cp: omitting directory `./GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}'
cp: omitting directory `./Links'
cp: omitting directory `./Lokala inst\303\244llningar'
cp: omitting directory `./Mallar'
cp: omitting directory `./Mina dokument'
cp: omitting directory `./Music'
cp: `./NTUSER.DAT.exe' and `/c/test/NTUSER.DAT' are the same file
cp: omitting directory `./N\303\244tverket'
cp: omitting directory `./Pictures'
cp: omitting directory `./Programdata'
cp: omitting directory `./Recent'
cp: omitting directory `./Saved Games'
cp: omitting directory `./Searches'
cp: omitting directory `./SendTo'
cp: omitting directory `./Skrivare'
cp: omitting directory `./Start-meny'
cp: omitting directory `./Videos'
cp: `./ntuser.dat.LOG1.exe' and `/c/test/ntuser.dat.LOG1' are the same file
cp: `./ntuser.dat.LOG2.exe' and `/c/test/ntuser.dat.LOG2' are the same file

Simon@SIMONS-DATOR ~
$ ls /c/test
NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TM.blf
NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer00000000000000000001.regtrans-ms
NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer00000000000000000002.regtrans-ms
NTUSER.DAT{6a7ede06-4c18-11e0-86c3-00262d9124f7}.TM.blf
NTUSER.DAT{6a7ede06-4c18-11e0-86c3-00262d9124f7}.TMContainer00000000000000000001.regtrans-ms
NTUSER.DAT{6a7ede06-4c18-11e0-86c3-00262d9124f7}.TMContainer00000000000000000002.regtrans-ms
NTUSER.DAT{8ef111c8-e816-11df-8bd5-00262d9124f7}.TM.blf
NTUSER.DAT{8ef111c8-e816-11df-8bd5-00262d9124f7}.TMContainer00000000000000000001.regtrans-ms
NTUSER.DAT{8ef111c8-e816-11df-8bd5-00262d9124f7}.TMContainer00000000000000000002.regtrans-ms
NTUSER.DAT{e9e59e5b-940d-11e0-8662-00262d9124f7}.TM.blf
NTUSER.DAT{e9e59e5b-940d-11e0-8662-00262d9124f7}.TMContainer00000000000000000001.regtrans-ms
NTUSER.DAT{e9e59e5b-940d-11e0-8662-00262d9124f7}.TMContainer00000000000000000002.regtrans-ms
_.swp
_viminfo
ntuser.ini
php_errors.log

我不希望复制这些 ntuser 文件。如果我递归复制,我不希望复制以下文件夹(翻译尝试向右):

~/Contacts
~/Cookies
~/Lokala inställningar    (Local settings)
~/Mallar                  (Templates)
~/Mina dokument           (My documents)
~/Nätverket               (The network)
~/Programdata
~/Recent
~/SendTo
~/Skrivare                (Printers)
~/Start-meny              (Start menu)

如果我尝试复制 recursivley,上面提到的所有文件夹都将在目的地创建,但它们将保持为空,因为对它们的权限似乎被拒绝:

cp: cannot access `/c/Users/Simon/Cookies': Permission denied
cp: cannot access `/c/Users/Simon/Documents/Min musik': Permission denied
cp: cannot access `/c/Users/Simon/Documents/Mina bilder': Permission denied
cp: cannot access `/c/Users/Simon/Documents/Mina videoklipp': Permission denied
cp: cannot access `/c/Users/Simon/Lokala inst\303\244llningar': Permission denied
cp: cannot access `/c/Users/Simon/Mallar': Permission denied
cp: cannot access `/c/Users/Simon/Mina dokument': Permission denied
`/c/Users/Simon/NTUSER.DAT' -> `/e/Backup/Simon/NTUSER.DAT'
cp: `/c/Users/Simon/NTUSER.DAT.exe' and `/e/Backup/Simon/NTUSER.DAT' are the same file
cp: cannot access `/c/Users/Simon/N\303\244tverket': Permission denied
cp: cannot access `/c/Users/Simon/Programdata': Permission denied
cp: cannot access `/c/Users/Simon/Recent': Permission denied
cp: cannot access `/c/Users/Simon/SendTo': Permission denied
cp: cannot access `/c/Users/Simon/Skrivare': Permission denied
cp: cannot access `/c/Users/Simon/Start-meny': Permission denied
`/c/Users/Simon/ntuser.dat.LOG1' -> `/e/Backup/Simon/ntuser.dat.LOG1'
cp: `/c/Users/Simon/ntuser.dat.LOG1.exe' and `/e/Backup/Simon/ntuser.dat.LOG1' are the same file
`/c/Users/Simon/ntuser.dat.LOG2' -> `/e/Backup/Simon/ntuser.dat.LOG2'
cp: `/c/Users/Simon/ntuser.dat.LOG2.exe' and `/e/Backup/Simon/ntuser.dat.LOG2' are the same file

从上面的日志中可以看出,~/Documents 中似乎有额外的不需要的文件夹(翻译尝试向右):

./Min musik          (My music)
./Mina bilder        (My pictures)
./Mina videoklipp    (My video clips)

无论如何,由于权限被拒绝,我不会因为这个问题而受苦:在我的目标文件夹中只会有一些额外的不必要的空文件夹和一些额外的不必要的文件,以及一些“权限被拒绝”的抱怨来自日志中的cp

在使用cp 命令进行实验之前,我什至不知道这些文件。显然,必须取消选中文件夹选项中的“隐藏受保护的操作系统文件(推荐)”,以便它们显示在 Windows 资源管理器中,然后,当它们出现时,它们上面有那个小箭头,就像快捷方式一样,并且它们是半透明的,就像隐藏文件一样(如~/AppData)。

真正的用途是一个小的备份脚本,它使用cp $src "$dstdir" --update --archive --backup=numbered --verbose 进行实际复制,使用shopt -s extglob; shopt -s dotglobsrc="/c/Users/Simon/!(AppData)"(注意--arcgive 意味着递归复制),如果有任何感兴趣的话. 编辑: 应该注意的是,我想用上述备份脚本实现的目的是备份我的用户文件夹中的大多数文件(最重要的是我的文档、图片和视频,还有例如 .ssh 和.gitconfig 碰巧在那里(除非我遵循 VonC 回答的建议))。我只是碰巧使用了 Git bash,因为我已经安装了它,它提供了一种非常简单的方法来进行我想要的备份。它与 Git 无关。另请参阅下方的其他编辑。

那么如何防止cp 命令尝试复制这些文件呢? (或者,我应该使用 cp 以外的其他东西吗?(模糊的问题,我知道,但这不是主要问题,如果需要我可以详细说明。)

最初是一个子问题:这些文件是什么? (据我所知,它们中的许多都作为 Windows XP 上更“正常”的文件夹存在。)编辑:它们可能是 Windows XP 的遗留物,至少是Local Settings is

编辑: 为了备份文件,这似乎是我的根本问题,感谢 VonC,我现在有很多解决方案和选项:

我已将%HOME% 设置为/c/git,这是我保存所有存储库的位置,因此所有Git (bash) 文件都可以在一个地方使用。此外,它简化了备份:我可以轻松地指向更具体的目标,而不是备份/c/Users/Simon/!(AppData)(如前所述):

"/c/Users/Simon/Documents/*"
"/c/Users/Simon/Music/*"
"/c/Users/Simon/Pictures/*"
"/c/Users/Simon/Videos/*"
"/c/Users/Simon/Desktop/*"

因此,我已经避免了这个问题大部分,在~/Documents 左侧仍有不需要的文件夹(见上文)。

我现在了解到,Windows 特定工具,例如 xcopyxxcopyrobocopy,可能更适合备份,但现在我更喜欢 cp 的简单性,而不必深入研究Windows 命令行。

我希望这些关于备份的冗长 cmets 对某人有用。我考虑“我应该使用cp以外的其他东西吗?”问题得到了全面解答,我的主要问题也基本解决了。

仍然,“我怎样才能防止 cp 命令尝试复制这些/此类文件?” 问题仍未解决(除了“使用 Windows 特定工具”之类的答案) 并且可能与许多人相关。

【问题讨论】:

    标签: windows-7 cp git-bash protected-folders


    【解决方案1】:

    如果您想要编写备份脚本,最好避免使用 cp,并使用 Windows 实用程序,例如 xxcopy:
    它可以管理各种 bazckup 场景,包括增量场景,with exclusion list


    以 git 为中心的原始答案

    如果未定义 %HOME%git-cmd.batgit-bash 都将尝试使用 %USERPROFILE%

    我建议在调用 git 命令之前定义环境变量 %HOME%,以便您的 HOME 仅包含您使用 git 所需的内容(@ 987654330@, _netrc, .ssh, ...),并进行开发。

    这样,您可以准确控制cp 所需的内容,而不是试图整理/c/Users/aLoginName 的巨大混乱。

    【讨论】:

    • 虽然这是个好建议,但这不是我想要的。我会澄清我的问题。
    • @lydell 明白了,你的问题现在很清楚了。我已经编辑了我的答案并提出了替代方案。
    • 谢谢。应该注意的是,“原始以 git 为中心的答案”毕竟不是那么“以 git 为中心”:它主要帮助解决了我的问题,并产生了一些很好的副作用! (请参阅我的编辑。)
    • @lydell 非常好。至少,你找到了适合你的方法。我会继续关注cp 问题。
    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多