find には除外オプションがあるため、find + xargs + mv を使用します:
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
これはほぼ find の man ページからコピーされたものであることに注意してください (mv --target-directory を使用する方が cpio よりも優れていると思います)。
dir 構造が次のようなものであると仮定しましょう。
|parent
|--child1
|--child2
|--grandChild1
|--grandChild2
|--grandChild3
|--grandChild4
|--grandChild5
|--grandChild6
そして、次のように見えるようにファイルを移動する必要があります。
|parent
|--child1
| |--grandChild1
| |--grandChild2
| |--grandChild3
| |--grandChild4
| |--grandChild5
| |--grandChild6
|--child2
この場合、2 つのディレクトリ child1
を除外する必要があります。 そして child2
、残りのディレクトリを child1
に移動します ディレクトリ。
使用、
mv !(child1|child2) child1
これにより、残りのすべてのディレクトリが child1
に移動されます ディレクトリ。
これはまさにあなたが求めていたものではありませんが、うまくいくかもしれません:
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
を取得できる可能性があります
最初にファイルとフォルダの名前を取得し、必要なものを除外します:
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
次に、フィルタリングされた名前を mv
に渡します 最初のパラメーターと 2 番目のパラメーターが宛先になるため:
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/