如何使用'mv'命令移动除特定目录中的文件以外的文件?

Dav*_*Liu 38 linux mv

我想知道 - 我如何移动目录中的所有文件,除了特定目录中的那些文件(因为'mv'没有'--exclude'选项)?

Cha*_*ghe 71

让我们假设dir结构是这样的,

|parent
    |--child1
    |--child2
    |--grandChild1
    |--grandChild2
    |--grandChild3
    |--grandChild4
    |--grandChild5
    |--grandChild6
Run Code Online (Sandbox Code Playgroud)

我们需要移动文件,看起来像,

|parent
    |--child1
    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6
    |--child2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你需要排除两个目录child1child2,并在移动的目录其余child1目录.

使用,

mv !(child1|child2) child1
Run Code Online (Sandbox Code Playgroud)

这会将所有其余目录移动到child1目录中.

  • 提示:请注意,使用此模式依赖于`\ textglob`.您可以使用`shopt -s\textglob`启用它(如果您希望`extended globs`默认打开,您可以将`shopt -s\textglob`添加到.bashrc) (15认同)
  • 在尝试执行此命令时,我一直收到`-bash:!:event not found`. (8认同)
  • Derp,刚刚意识到上面的注释是 bash 所必需的。 (3认同)

Sla*_*ast 6

由于 find 确实有排除选项,因此使用 find + xargs + mv:

find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
Run Code Online (Sandbox Code Playgroud)

请注意,这几乎是从 find 手册页复制的(我认为使用 mv --target-directory 比 cpio 更好)。


小智 5

首先获取文件和文件夹的名称并排除您想要的任何内容:

ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
Run Code Online (Sandbox Code Playgroud)

然后将过滤后的名称作为mv第一个参数传递,第二个参数将是目标:

mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/
Run Code Online (Sandbox Code Playgroud)