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.