Rsync, yalnızca bazı dizinleri hariç tutarak belirli dosya türlerini içerir


14

Sadece belirli dosya türlerini (örneğin .py) rsync istiyorum ve bazı dizinlerdeki dosyaları (örneğin venv) hariç tutmak istiyorum .

Ben denedim budur:

rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

Ama işe yaramıyor.

Neyi kaçırıyorum?

Ben de bu sorunun cevabını takip ettim ama yardımcı olmadı.


neden baş harfine ihtiyacınız var --include='*/'?
— Charlie Parker

1
Yalnızca bir tür dosya göndermek istediğim özyinelemeli dizinlerim varsa komut nasıl oluşturulur. Görünüşe göre sadece hedef dizin için her şeyi hariç tutan son dışlama nedeniyle bunu yapıyor
— Charlie Parker

Yanıtlar:


17

venv/hariç tutulması gerekir önce */ dahildir:

rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

Bu incelik, rsynckuralları sırayla işleyen ve ilk eşleşen kuralın kazandığıdır. Bu nedenle, --include='*/'daha önce varsa , --exclude='venv/'dizin venv/tarafından dahil edilir --include='*/'ve exclude kuralına hiçbir zaman başvurulmaz.

Bunu basitleştirebilir miyiz?

Neden ihtiyacımız var --include='*/'ve --exclude='*'? Neden --exclude=venv/ --include='*.py'yeterli değil ?

Varsayılan dosya / dizinleri dahil etmektir. Bu yüzden şunu düşünün:

rsync -avz --exclude='venv/' --include='*.py' source target

Bu, altındaki dosyalar veya dizinler hariç her şeyi içerir venv/. Ancak, yalnızca .pydosya istersiniz . Bu, diğer dosyaları açıkça hariç tutmamız gerektiği anlamına gelir --exclude='*'.

--exclude='*'dışlayan hem dosyaları ve dizinleri. Bu nedenle, belirtirsek --exclude='*', tüm dizinler hariç tutulur ve yalnızca .pykök dizindeki dosyalar bulunur. Dışlanan .pydizinlere bakmadığından alt dizinlerdeki dosyalar hiçbir zaman bulunamaz rsync. Bu nedenle, eğer varsa --exclude='*', --include='*/'tüm dizinlerin içeriğinin araştırılmasını sağlamak için ondan önce gelmeliyiz.


Harika! Teşekkürler! Sadece anlayışım için neden ihtiyacımız var --include='*/'ve --exclude='*'? Neden sadece --exclude=venv/ --include='*.py'çalışmıyor?
— CentAu

1
@CentAu Cevabı yeni bir tartışma ile güncelledim.
— John1024

Yalnızca bir tür dosya göndermek istediğim özyinelemeli dizinlerim varsa komut nasıl oluşturulur. Görünüşe göre sadece hedef dizin için her şeyi hariç tutan son hariç tutma nedeniyle bunu yapıyor.
— Charlie Parker

1
Bookmarking! Özellikle incelik için. Bayrakların sırasının hiç önemli olmadığı başka bir CLI yardımcı programını düşünemiyorum !
— antortjim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.