Windows 7 - Git bash 'cp' – 排除"protected operating system files"(那些是什么?



如果我尝试在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 inst303244llningar'
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 `./N303244tverket'
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 inst303244llningar': 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/N303244tverket': 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 --verboseshopt -s extglob; shopt -s dotglobsrc="/c/Users/Simon/!(AppData)"进行实际复制(请注意,--arcgive意味着递归复制),如果其中任何一个感兴趣的话编辑:需要注意的是,我想用上述备份脚本实现的是备份我的用户文件夹中的大多数文件(最重要的是我的文档、图片和视频,还有碰巧在那里的.ssh和.gitconfig(除非我听从VonC的建议))。我只是碰巧使用了Gitbash,因为我已经安装了它,它提供了一种非常简单的备份方式。它与Git无关。另请参阅下面的附加编辑。

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

最初是一个子问题:这些文件是什么?(据我记忆所及,它们中的许多在Windows XP上是作为更"正常"的文件夹存在的。)编辑:它们可能是Windows XP遗留下来的,至少本地设置是。

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

我已经将%HOME%设置为/c/git,这是我已经保存所有repo的地方,所以所有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命令行。

我希望这些关于备份的冗长评论对某些人有用。我认为"我应该使用cp以外的东西吗?"这个问题得到了充分的回答,我的主要问题基本上得到了解决。

尽管如此,"如何阻止cp命令尝试复制这些/此类文件?"问题仍未解决(除了"使用Windows特定工具"之类的答案),可能与许多人有关。

如果要编写备份脚本,最好避免cp,并使用windows实用程序,如xxcopy
它可以管理所有类型的bazzup场景,包括增量场景,并带有排除列表。


以数字为中心的原始答案

如果未定义%HOME%,git-cmd.bat和git-bash都将使用%USERPROFILE%

我建议在调用git命令之前定义环境变量%HOME%,以便HOME只包含使用git(.gitconfig_netrc.ssh…)和开发所需的内容。

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

最新更新