Bir dizini kopyalamak ve içindeki belirli dosyaları / alt dizinleri dışlamak için 'cp' komutunu kullanmanın bir yolu var mı?
Bir dizini kopyalamak ve içindeki belirli dosyaları / alt dizinleri dışlamak için 'cp' komutunu kullanmanın bir yolu var mı?
Yanıtlar:
Kullanım rsync:
rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Kullanmanın sourceve source/farklı olduğuna dikkat edin . Bir sondaki klasörünün içeriğini kopyalamak için aracı çizgi sourceiçine destination. Sondaki eğik çizgi olmadan, klasör kaynağını içine kopyalamak anlamına gelir destination.
Hariç tutmak dizinleri (veya dosya) bir sürü varsa Alternatif olarak, kullanabilirsiniz --exclude-from=FILEnerede, FILEdosya veya dışlamak için dizinleri içeren bir dosyanın adıdır.
--exclude ayrıca, örneğin --exclude=*/.svn*
Kopyalanan Kaynak: https://stackoverflow.com/a/2194500/749232
cpKendisini kullanmak istiyorsan :
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Bu, hedef dizin yapısının kaynağınkiyle aynı olduğunu varsayar.
Kopyalanan Kaynak: https://stackoverflow.com/a/4586025/749232
Oyunun sonlarına gelindiğinde, ancak burada sade bash ve cp kullanarak çok farklı bir çözüm var: Bazı dosyaları yoksayırken genel bir dosya belirtimi kullanabilirsiniz.
Dizinin dosyaları içerdiğini varsayalım:
$ ls *
listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3
GLOBIGNORE değişkenini kullanarak :
$ export GLOBIGNORE='unlisted*'
$ ls *
listed1 listed2 listed3 listed4
Veya daha spesifik istisnalar hariç:
$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1 listed2 listed3 listed4 unlisted3
Veya negatif eşleşmeleri kullanarak :
$ ls !(unlisted*)
listed1 listed2 listed3 listed4
Bu aynı zamanda birkaç eşsiz deseni destekler:
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3
shopt -s extglobayrıca dışa aktarmanıza gerek yokturGLOBIGNORE: mevcut kabuğun davranışını değiştirmesi gerekir, çoğu alt program bunu umursamaz.