У меня есть дерево файлов, которое выглядит так:

in
├── file1
├── dir1
└── dir2
    ├── dir3
    │   ├──── file2
    │   └──── junk1
    ├── junk2
    └── junk3

Я хочу создать брат, in котором выглядит следующим образом:

out
├── file1
├── dir1
└── dir2
    └─── dir3
         └── file2

Другими словами, рекурсивно копируйте in out исключая in/dir2 но включая in/dir2/dir3/file2 .

Я пробовал следующее:

rsync -a --exclude='in/dir2' --include='in/dir2/dir3/file2' in out

Что приводит к следующему:

out
└── in
    └── file1

Поэтому я попробовал следующее:

rsync -a --exclude='dir2' --include='dir2/dir3/file2' in/ out

Что приводит к:

out
└── file1

Как я могу достичь того, что я хочу, с помощью rsync или других инструментов Unix? Я бы предпочел не использовать странные методы, такие как отправка tar в tar ...

2 ответа2

1

С помощью rsync вы можете изучить параметры --exclude-from=FILE и --include-from=FILE .

--include-from=FILE
        This  option is related to the --include option, but it specifies a FILE that contains include patterns
        (one per line).  Blank lines in the file and lines starting with ’;’ or ’#’ are ignored.  If FILE is -,
        the list will be read from standard input.
0

Как насчет разбить это на более чем одну команду rsync и объединить их в сценарий оболочки.

Другой возможной альтернативой является комбинация find с cpio для устройства назначения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .