Я хочу включить все файлы верхнего уровня (file1.txt , file2) и только что-нибудь в /top/dir1/ . Как мне этого добиться?

Я пробовал следующее, но они не работают

$ tree
.
└── from
    ├── file1.txt
    ├── file2
    └── top
        ├── dir1
        │   └── file3.txt
        └── dir2
            └── file4.txt

одна попытка, пропустить файлы верхнего уровня

$ rsync --dry-run \
>       --include='top/' \
>       --include='top/dir1/' \
>       --include='top/dir1/***' \
>       --exclude='top/*' \
>       --exclude="*" \
>       -av from/* .
building file list ... done
top/
top/dir1/
top/dir1/file3.txt

другая попытка включить файлы верхнего уровня, но это не исключает dir2

$ rsync --dry-run \
>       --include="*" \
>       --include='top/' \
>       --include='top/dir1/' \
>       --include='top/dir1/***' \
>       --exclude='top/*' \
>       --exclude="*" \
>       -av from/* .
building file list ... done
file1.txt
file2
top/
top/dir1/
top/dir1/file3.txt
top/dir2/
top/dir2/file4.txt

2 ответа2

0

Если вы не возражаете против использования другой команды для фильтрации, вы можете использовать пару команд GNU find :

(cd from; find . -mindepth 1 -type f -print0; find ./top/dir1 -print0;) |
  rsync -av --from0 --files-from=- from/ to

От man rsync:

    --files-from=FILE       read list of source-file names from FILE
-0, --from0                 all *from/filter files are delimited by 0s

rsync может принять список файлов для синхронизации из другого файла (или стандартного ввода -), но пути должны быть относительными (или мы должны использовать --no-R чтобы разрешить абсолютные пути). Следовательно, сначала cd в исходный каталог, затем запустите find с соответствующими параметрами:

  • -mindepth 1 ограничить только указанными каталогами, не обращаясь к подкаталогам
  • -type f чтобы вывести список только обычных
  • -print0 для ограничения вывода с использованием символов ASCII NUL (\0)
0

Вы можете использовать следующее, чтобы включить ВСЕ на верхнем уровне и только dir1 под верхним.

rsync --dry-run \                                      
   --include='top/dir1/***' \
   --exclude='top/*' \
   -av from/ .

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