Czy istnieje sposób użycia polecenia „cp” do skopiowania katalogu i wykluczenia niektórych plików / podkatalogów w nim zawartych?
Czy istnieje sposób użycia polecenia „cp” do skopiowania katalogu i wykluczenia niektórych plików / podkatalogów w nim zawartych?
Odpowiedzi:
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
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
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.