polecenie cp, aby wykluczyć niektóre pliki z kopiowania

35

Czy istnieje sposób użycia polecenia „cp” do skopiowania katalogu i wykluczenia niektórych plików / podkatalogów w nim zawartych?

Stephen Jacob
źródło

Odpowiedzi:

57

Użyj rsync:

rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

Pamiętaj, że używanie sourcei source/są różne. Końcowy ukośnik oznacza skopiowanie zawartości folderu sourcedo destination. Bez końcowego ukośnika oznacza to skopiowanie źródła folderu do destination.

Alternatywnie, jeśli masz wiele katalogów (lub plików) do wykluczenia, możesz użyć --exclude-from=FILE, gdzie FILEjest nazwa pliku zawierającego pliki lub katalogi do wykluczenia.

--exclude może również zawierać symbole wieloznaczne, takie jak --exclude=*/.svn*

Skopiowano z: https://stackoverflow.com/a/2194500/749232

Jeśli chcesz się użyć cp:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Zakłada się, że struktura katalogu docelowego jest taka sama jak źródła.

Skopiowano z: https://stackoverflow.com/a/4586025/749232

saji89
źródło
3

Późno w grze, ale tutaj jest zupełnie inne rozwiązanie, używając zwykłego bash i cp: możesz użyć globalnej specyfikacji plików, ignorując niektóre pliki.

Załóżmy, że katalog zawiera pliki:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3

Korzystanie ze zmiennej GLOBIGNORE :

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4

Lub z bardziej szczegółowymi wykluczeniami:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3

Lub używając dopasowań wykluczających :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

Obsługuje również kilka niedopasowanych wzorów:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3
ksenoid
źródło
1
W przypadku negatywnych dopasowań musisz mieć włączone rozszerzone globusy: shopt -s extglobtakże nie musisz eksportować GLOBIGNORE: ma to modyfikować zachowanie bieżącej powłoki, większość programów potomnych nie przejmowałaby się tym.
muru