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 source
ve source/
farklı olduğuna dikkat edin . Bir sondaki klasörünün içeriğini kopyalamak için aracı çizgi source
iç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=FILE
nerede, FILE
dosya 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
cp
Kendisini 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 extglob
ayrıca dışa aktarmanıza gerek yokturGLOBIGNORE
: mevcut kabuğun davranışını değiştirmesi gerekir, çoğu alt program bunu umursamaz.