Protože find má možnost vyloučit, použijte find + xargs + mv:
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
Všimněte si, že toto je téměř zkopírováno z manuálové stránky find (myslím, že použití mv --target-directory je lepší než cpio).
Předpokládejme, že struktura dir je podobná,
|parent
|--child1
|--child2
|--grandChild1
|--grandChild2
|--grandChild3
|--grandChild4
|--grandChild5
|--grandChild6
A potřebujeme přesunout soubory tak, aby to vypadalo jako,
|parent
|--child1
| |--grandChild1
| |--grandChild2
| |--grandChild3
| |--grandChild4
| |--grandChild5
| |--grandChild6
|--child2
V tomto případě musíte vyloučit dva adresáře child1
a child2
a přesuňte zbytek adresářů do child1
adresář.
použití,
mv !(child1|child2) child1
Tím přesunete všechny zbývající adresáře do child1
adresář.
Není to přesně to, co jste požadovali, ale mohlo by to fungovat:
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
(V podstatě přesuňte vyloučenou složku z většího stromu, který chcete přesunout.)
Takže pokud mám a/
a chci vyloučit a/b/c/*
:
mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c
Nebo něco takového. Jinak byste mohli získat find
abychom vám pomohli.
Nejprve získejte názvy souborů a složek a vylučte, co chcete:
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
Poté předejte filtrovaná jména do mv
jako první parametr a druhý parametr bude cíl:
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/