使用 mv 命令时如何排除文件夹

Geo*_*sen 8 command-line bash mv

我有这种情况,我想在使用mv命令时排除一个目录。我看到了这个例子,其中的语法是!(exclude_dir),但是当我设置一个场景来测试它时,我得到了我不完全理解的结果。

现在我已经创建了三个文件夹:f1,f2f3. 现在我以这种方式使用命令:

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)

此表达式匹配除f1and之外的所有内容f3

这也适用于*,?[…]

$ ls
e1  e2  e3  f1  f2  f3
$ ls !(e*|?[12])
f3
Run Code Online (Sandbox Code Playgroud)