Answers:
免责声明:该答案专门针对Bash,但其中大部分适用于有关glob模式的问题!
星号(*
)是通配符。有一定的字符集可以代替,而第一个字符是点(.
)并不是其中一个。这是一种特殊情况,仅因为Unix文件系统如何工作,以点开头的文件被认为是“隐藏的”。这意味着,工具等cp
,ls
等,将“看”不到它们,除非明确告知这样做。
首先,让我们创建一些样本数据。
$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
所以现在我们有以下内容:
$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
现在让我们玩一些游戏。您可以使用该命令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
您可以使用该命令shopt -s dotglob
来更改的行为,*
以便除类似文件之外的其他文件regfile1
也将匹配.dotfile1
。
bash
手册页摘录
dotglob If set, bash includes filenames beginning with a `.' in the results
of pathname expansion.
例:
$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
您可以使用以下命令还原此行为:
$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
对于您,您要告诉cp
您要复制所有与模式匹配的文件*
,并且没有任何文件。
$ cp foo/.* .
或者,如果您希望foo
文件夹中的所有内容都可以这样做:
$ cp foo .
或者您可以明确:
$ cp foot/.* foo/* .
使用括号扩展的更紧凑形式bash
:
$ cp foo/{.,}* .
在任何时候,您都可以使用echo
技巧来查看您建议的文件格式(这是星星所代表的花哨术语)。
$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
顺便说一句,如果您要复制文件目录和其他目录,通常需要递归执行,这是-R
切换到cp
:
$ cp -R foo/. .
shopt -s dotglob
,echo *
然后给出:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
cp -r foo .
通常可能无法正常工作,因为您可能cp
会拒绝复制foo
自身cp -R foo/. .
。(请注意,这cp -R
是标准的)。
zsh
中不包含.
和。在中,如果模式不匹配,该命令将中止(再次明智地退出),因此在一般情况下,如果没有隐藏文件或没有非隐藏文件,该命令将失败。..
.*
zsh
cp foo/{,.}* .
shopt
不存在。
如果您想要将所有文件和目录从一个位置复制到另一个位置,则可以使用标准rsync
命令。在上面的示例中,您给出了:
mkdir foo && touch foo/.test
rsync -a foo/ .
将以递归方式将的所有内容(foo
包括隐藏文件和隐藏目录)复制到当前目录中。foo/
对rsync而言,末尾的斜杠很重要。使用它,仅foo
复制的内容,没有复制,rsync也将复制foo
。例如:-
mkdir src && mkdir dest && touch src/.test
rsync -a src dest // copies 'src' contents to 'dest/src'
rsync -a src/ dest // copies 'src' contents to 'dest'
有许多其他选项可用于调整rsync,包括在计算机之间进行复制。
dotglob
globdots
由zsh转换为bash的无效选项名称。