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 source
i source/
są różne. Końcowy ukośnik oznacza skopiowanie zawartości folderu source
do 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 FILE
jest 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 extglob
także nie musisz eksportowaćGLOBIGNORE
: ma to modyfikować zachowanie bieżącej powłoki, większość programów potomnych nie przejmowałaby się tym.