Gdybym chciał, aby skopiować wszystkie *.so
pliki src
do dst
zrobiłbym:
cp src/*.so dst
Chcę jednak skopiować wszystkie *.so
pliki z src i jego podkatalogów do dst
. Jakieś wskazówki?
Próbować:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
find
Potrafi dopasowywać wzorce i wykonywać polecenia. Nie trzeba przesyłać danych wyjściowych:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'
grep
znacznie przewyższają proste wzorce powłoki używane w-name
parametrze dofind
.xargs
jest również znacznie potężniejszy niż-exec
parametr dofind
.Jeśli używasz Bash, możesz włączyć
globstar
opcję powłoki, aby rekurencyjnie dopasowywać pliki i katalogi:Jeśli chcesz znaleźć pliki, których nazwy zaczynają się od
.
, i / lub pliki w i pod katalogami, których nazwy zaczynają się od.
, ustawdotglob
również opcję (np. Zshopt -s dotglob
). Możesz ustawić je oba za pomocą jednego polecenia:źródło
Wypróbowałem polecenie sugerowane przez Mike'a:
ale skończyło się to zrzuceniem wszystkich plików do katalogu
dst
z utratą ich ścieżek względnych.Aby zachować ścieżki względne, polecenie należy zmodyfikować w następujący sposób:
źródło
dst
. Jeśli tak nie jest, użyjcp --parents
. Pamiętaj też, aby podać nazwy plików. Zatem:... | xargs -i cp --parents "{}" dst
(zauważ, że ostatnim argumentemcp
jest teraz „tylko” katalog docelowy). Polecenie może być wykonane nawet krótszy (i prawdopodobnie szybciej) przy użyciu-t
flagi:... | xargs cp --parents -t dst
.... | xargs cp {} --parents -t dst.
--parents
nie jest dostępny. Użyłemditto
zamiast niego: stackoverflow.com/questions/11246070/cp-parents-option-on-macKolejny sposób to zrobić:
źródło
cp
procesów:... -exec cp -t dst/ {} +
.-exec
się;
,{}
otrzymuje jedną ścieżkę naraz. Dostajesz osobnycp
dla każdego pliku. Z+
składniowychfind
replaces{}
z wieloma wynikami (do granicy systemowej zdefiniowanej długości linii poleceń ograniczeń:{}
musi być ostatnią rzeczą przed+
, stądcp -t
). Tworzenie i kończenie procesu jest względnie kosztowne. Z tego powodu warto go używać,+
gdy oczekuje się wielu wyników. W takim przypadku kopiowanie dużej liczby plików i tak może zająć dużo czasu, więc różnica może minąć niezauważona; niemniej jednak jest to dobra praktyka.Grep można zastąpić za pomocą polecenia find's -name :
źródło