使用 glob 模式 cp 隐藏文件

Gra*_*ent 17 zsh cp wildcards dot-files

情况 :

$ mkdir foo && touch foo/.test
$ cp foo/* .
zsh: no matches found: foo/*
(or bash : cp: cannot stat ‘foo/*’: No such file or directory)
Run Code Online (Sandbox Code Playgroud)

我有一个充满隐藏文件夹和文件的目录。发生了什么,解决方案是什么?

Sté*_*las 35

使用zsh,典型的方法是使用D glob 限定符(包括 [D]ot 文件):

cp foo/*(D) .
Run Code Online (Sandbox Code Playgroud)

请注意,无论有没有D,zsh globs 都不会包含...(如您所料)。


slm*_*slm 21

免责声明:此答案专门针对 Bash,但其中大部分适用于有关 glob 模式的问题!

星号 ( *) 是通配符。有一组特定的字符可以代替,第一个字符是点 ( .) 不是其中的一个。这是一种特殊情况,仅仅因为 Unix 文件系统的工作方式,以点开头的文件被认为是“隐藏的”。这意味着,工具等cpls等,将“看”不到它们,除非明确告知这样做。

例子

首先让我们创建一些示例数据。

$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
Run Code Online (Sandbox Code Playgroud)

所以现在我们有以下内容:

$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
Run Code Online (Sandbox Code Playgroud)

现在让我们玩一些游戏。您可以使用该命令echo列出*给定命令的特定通配符 ( ),如下所示:

$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3


$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3

$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2

$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3

$ echo .dotdir*
.dotdir1 .dotdir2
Run Code Online (Sandbox Code Playgroud)

改变行为?

您可以使用该命令shopt -s dotglob来更改 的行为,*以便除了像regfile1它这样的文件也将匹配.dotfile1.

摘自bash手册页

dotglob If set, bash includes filenames beginning with a `.' in the results 
        of pathname expansion.
Run Code Online (Sandbox Code Playgroud)

例子:

$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令恢复此行为:

$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
Run Code Online (Sandbox Code Playgroud)

你的情况?

对于您来说,您是在告诉cp您要复制与 pattern 匹配的所有文件*,并且没有任何文件。

$ cp foo/.* .
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要foo文件夹中的所有内容,也可以这样做:

$ cp foo .
Run Code Online (Sandbox Code Playgroud)

或者你可以明确:

$ cp foot/.* foo/* .
Run Code Online (Sandbox Code Playgroud)

在 中使用大括号扩展的更紧凑的形式bash

$ cp foo/{.,}* .
Run Code Online (Sandbox Code Playgroud)

您可以随时使用该echo技巧来查看您建议的文件模式(这是明星所属的奇特术语)。

$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您要复制文件目录+其他目录,您通常希望递归地执行此操作,那就是-R切换到cp

$ cp -R foo/. .
Run Code Online (Sandbox Code Playgroud)

  • 此答案仅适用于 bash。提问者正在使用 zsh,答案是 [简单得多](http://unix.stackexchange.com/questions/89749/cp-hidden-files-with-glob-patterns/89771#89771) 和 `shopt`不存在。 (8认同)