Как использовать команду " mv " для перемещения файлов, кроме файлов в определенном каталоге?

Мне интересно - как я могу переместить все файлы в каталоге, кроме этих файлов в определенном каталоге (поскольку " mv "не имеет опции "--exclude")?

4 ответов


предположим, что структура dir похожа,

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

и нам нужно переместить файлы, чтобы это выглядело так:

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

в этом случае необходимо исключить два каталога child1 и child2, и переместить остальные каталоги в .

использовать

mv !(child1|child2) child1

это переместит все остальные каталоги в .


поскольку find имеет опцию exclude, используйте find + xargs + mv:

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

обратите внимание, что это почти скопировано с man-страницы find (я думаю, что использование MV --target-directory лучше, чем cpio).


Это не совсем то, что вы просили, но это может сделать работу:

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, чтобы помочь вам.


Это переместит все файлы в или ниже текущего каталога не в ./ исключить / каталог в / везде...

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