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

时间:2011-01-06 05:52:02

标签: linux mv

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

9 个答案:

答案 0 :(得分:65)

让我们假设dir结构就像,

|parent
    |--child1
    |--child2
    |--grandChild1
    |--grandChild2
    |--grandChild3
    |--grandChild4
    |--grandChild5
    |--grandChild6

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

|parent
    |--child1
    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6
    |--child2

在这种情况下,您需要排除两个目录child1child2,并将其余目录移至child1目录。

使用,

mv !(child1|child2) child1

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

答案 1 :(得分:3)

由于find确实有一个exclude选项,因此请使用find + xargs + mv:

find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory

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

答案 2 :(得分:1)

这不是你要求的,但它可能会起作用:

mv the-folder-you-want-to-exclude somewhere-outside-of-the-main-tree
mv the-tree where-you-want-it
mv the-excluded-folder original-location

(基本上,将排除的文件夹移出要移动的较大树。)

所以,如果我有a/并且我想要排除a/b/c/*

mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c

或类似的东西。否则,您可能会find帮助您。

答案 3 :(得分:1)

这会将当前目录下或不在./exclude/目录中的所有文件移动到/ wherever ...

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;

答案 4 :(得分:1)

首先获取文件和文件夹的名称,并排除所需的任何内容:

ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...

然后将经过过滤的名称传递给mv作为第一个参数,第二个参数将成为目的地:

mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/

答案 5 :(得分:0)

#!/bin/bash

touch apple  banana  carrot  dog  cherry

mkdir fruit

F="apple  banana  carrot  dog cherry"

mv ${F/dog/} fruit

#这将从列表F中删除“狗”,因此它保留在      当前目录,但未移至“水果”

答案 6 :(得分:0)

ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir

答案 7 :(得分:0)

mv * exclude-dir

对我来说是完美的解决方案

答案 8 :(得分:0)

重命名您的目录以使其隐藏,以便通配符看不到它:

mv specific_dir .specific_dir 
mv * ../other_dir