Как мне исключить все, кроме определенных каталогов и одного типа файлов в rsync?

Как мне исключить все, кроме определенных каталогов и одного типа файлов в rsync?

Для проекта по NLP мне нужна копия библиотеки Project Gutenberg. Сейчас проект позволяет загружать свои файлы, особенно если это нужно для зеркалирования (я планирую в конечном итоге это сделать), но для моей работы мне нужно только определенное подмножество имеющихся файлов.

Каталоги в источнике организованы следующим образом:

|
| - 1 - |
|       |- 1
|       |- 2
|       |...
| - 2
| .
| .
| .
| - 9
| - cache
| - retired
| ...

Единственные каталоги, которые меня интересуют, — это пронумерованные, и единственный тип файлов, который меня интересует .txt, — это . Мне также не нужны файлы, заканчивающиеся на -8.txtили -h.txt, но пока я готов с ними мириться.

На данный момент я попробовал:

  • --include "*/" --include "*.txt" --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*-8.txt" --exclude "*"<- этот все еще тянет папку "cache", так как она также содержит некоторые .txtфайлы
  • --include "*/" --include "*.txt" -f'- *\-8.txt' -f'- *\-h.txt' -f'- cache/**' --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*"<- более или менее одно и то же

Проблема выглядит следующим образом:

  • Мне нужно исключитьвсе, так как мне нужен крайне ограниченный набор вещей
  • Я включаю пронумерованные каталоги, так как это все, что мне нужно.
  • Включение *.txtнарушает предыдущие исключения, поскольку другие каталоги также содержат текстовые файлы.

Как бы я это сделал?

решение1

Из поста rsync - исключить все каталоги, кроме нескольких, я цитирую из ответ Даррила Э. Кларка:

Простой фильтр должен сработать. Чтобы развить предыдущий ответ с надлежащим примером — явно включите родительские папки, а также все (**) подпапки и файлы. Затем исключите все остальное. Вот filter.txt:

+ /include_this_dir/
+ /include_this_dir/**
+ /include_that_dir/
+ /include_that_dir/**
- /** With the command line:

rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/

Результатом будет:

sending incremental file list
created directory dest_dir
./
include_that_dir/
include_that_dir/somefile.txt
include_that_dir/subdir/
include_this_dir/

sent 202 bytes  received 65 bytes  534.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Добавьте к этому ваш фильтр *.txt.

Другими словами: сначала включите, а затем исключите все.

решение2

Вы можете явно сопоставить пронумерованные каталоги с помощью glob [0-9]/:

 -f'+ [0-9]/' \
 -f'- *-[8h].txt' \
 -f'+ *.txt' \
 -f'- *' \

Если цифры превышают 9, возможно, будет достаточно добавить -f'+ [0-9][0-9]/или -f'+ [0-9]*/.

Связанный контент