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 文件系统的工作方式,以点开头的文件被认为是“隐藏的”。这意味着,工具等cp
,ls
等,将“看”不到它们,除非明确告知这样做。
首先让我们创建一些示例数据。
$ 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)