rsync non parla regex. Puoi arruolare find e grep, anche se diventa un po 'arcano. Per trovare i file di destinazione:
find a/ |
grep -i 'name'
Ma hanno tutti il prefisso "a /" - il che ha senso, ma quello che vogliamo finire è un elenco di modelli di inclusione accettabili per rsync, e poiché il prefisso "a /" non funziona per rsync I ' Lo rimuoverò con il taglio:
find . |
grep -i 'name' |
cut -d / -f 2-
C'è ancora un problema: ci mancheranno ancora i file nelle sottodirectory, perché rsync non cerca le directory nell'elenco di esclusione. Ho intenzione di utilizzare awk per aggiungere le sottodirectory di tutti i file corrispondenti all'elenco dei modelli di inclusione:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Non resta che inviare l'elenco a rsync - possiamo usare l'argomento --include-from = - per fornire un elenco di schemi da rsync sull'input standard. Quindi, complessivamente:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
Si noti che la directory di origine 'a' viene indicata tramite due percorsi diversi: "a /" e "./a/". Questo è sottile ma importante. Per rendere le cose più coerenti, farò un'ultima modifica e farò sempre riferimento alla directory di origine come "./a/". Tuttavia, questo significa che il comando cut deve cambiare in quanto ci sarà un ulteriore "./" sulla parte anteriore dei risultati di find:
find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
--exclude='*'
?