Geo*_*sen 8 command-line bash mv
我有这种情况,我想在使用mv
命令时排除一个目录。我看到了这个例子,其中的语法是!(exclude_dir)
,但是当我设置一个场景来测试它时,我得到了我不完全理解的结果。
现在我已经创建了三个文件夹:f1
,f2
和f3
. 现在我以这种方式使用命令:
mv -t f3/ !(f1) f2
Run Code Online (Sandbox Code Playgroud)
这会产生此错误:
mv: cannot move 'f3' to a subdirectory of itself, 'f3/f3'
mv: cannot stat 'f2': No such file or directory
Run Code Online (Sandbox Code Playgroud)
现在有趣的是文件夹的结构现在是:
.
??? f1
??? f3
??? f2
3 directories, 0 files
Run Code Online (Sandbox Code Playgroud)
它做我想要的,但为什么会出现错误消息。显然我没有正确使用该命令。
des*_*ert 11
这与 没有任何关系mv
,但它是一个bash
功能,引用man bash
:
如果使用shopt内置程序启用了extglob shell 选项,则可以识别多个扩展模式匹配运算符。在以下描述中,模式列表是由 | 分隔的一个或多个模式的列表。复合图案可以使用以下一种或多种子图案形成:
!(pattern-list)
匹配除给定模式之一之外的任何内容
!(f1)
匹配f2 f3
您的示例,因此您正在有效地执行以下操作:
mv -t f3/ f2 f3 f2
Run Code Online (Sandbox Code Playgroud)
为了实现您的目标,您应该这样做:
mv -t f3/ !(f[13]) # or !(f1|f3)
Run Code Online (Sandbox Code Playgroud)
此表达式匹配除f1
and之外的所有内容f3
。
这也适用于*
,?
和[…]
:
$ ls
e1 e2 e3 f1 f2 f3
$ ls !(e*|?[12])
f3
Run Code Online (Sandbox Code Playgroud)