Czy można skopiować pojedynczy plik do wielu katalogów za pomocą polecenia cp?
Próbowałem następujących, które nie działały:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Wiem, że jest to możliwe przy użyciu pętli for lub find. Ale czy jest to możliwe przy użyciu polecenia gnu cp?
Nie możesz tego zrobić
cp
sam, ale możesz połączyćcp
zxargs
:Skopiuje
file1
siędir1
,dir2
orazdir3
.xargs
zadzwonicp
3 razy, aby to zrobić, zobacz stronę podręcznika, abyxargs
uzyskać szczegółowe informacje.źródło
cp
sam”. Tylko dlatego, że odpowiedź była pomocna, sugerując inny sposób, nie oznacza, że na pytanie nie udzielono odpowiedzi.echo dir[1-3] | xargs -n 1 cp filename
.).Symbole wieloznaczne działają również z kodem Robertsa
źródło
O ile widzę, możesz użyć następujących czynności:
-i
Opcjacp
pomocą poleceń, które będą się pytanie, czy zapisać plik w bieżącym katalogu zfile.dat
. Chociaż nie jest to w pełni zautomatyzowane rozwiązanie, udało mi się.źródło
-i
strażnika, czy nie zachęci cię to do zapisania każdego pliku? zamiast kopiowania do katalogów?cp: overwrite
pytań, ale nie musiałem odpowiadać na żadne z nich i nie zastąpił plików.Chciałbym użyć
cat
itee
na podstawie odpowiedzi, które widziałem na /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets zamiastcp
.Na przykład:
źródło
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
jest również użytecznym wzorem, jak pokazuje odpowiedź Taywee. Zwróć uwagę na użycie przekierowania io z „<”, aby rurociągi od kota nie były potrzebne.Wszystkie te odpowiedzi wydają się bardziej skomplikowane niż oczywiste:
źródło
for d in */ ; do cp $file "$i" done
ls -db di*/subdir | xargs -n 1 cp File
-b
w przypadku, gdy w nazwie katalogu jest spacja, w przeciwnym razie zostanie ona podzielona przez xargs jako inny element, miał ten problem z wersją echaźródło
Nie używam cp per se, ale ...
To przyszło mi do głowy w kontekście kopiowania wielu nagrań Gopro z (wolnej) karty SD na trzy (wolne) dyski USB. Chciałem odczytać dane tylko raz, ponieważ zajęło to wieczność. I chciałem, żeby to było rekurencyjne.
(I możesz dodać więcej z tych sekcji> (), jeśli chcesz uzyskać więcej wyników).
Nie testowałem tego, ale jest zdecydowanie dużo szybszy niż cp-in-a-loop (lub kilka równoległych wywołań cp).
źródło
Aby użyć kopiowania
xargs
do katalogów za pomocą symboli wieloznacznych w systemie Mac OS, jedynym rozwiązaniem, które działało dla mnie ze spacjami w nazwie katalogu, jest:Gdzie
test
jest plik do skopiowaniaI
./fs*/*
katalogi do skopiowaniaProblem polega na tym, że xargs widzi spacje jako nowy argument, rozwiązania zmiany znaku separatora za pomocą
-d
lub-E
niestety nie działają poprawnie w systemie Mac OS.źródło
Jeśli chcesz to zrobić bez polecenia rozwidlonego:
tee <inputfile file2 file3 file4 ... >/dev/null
źródło
Zasadniczo równoważne z odpowiedzią xargs, ale w przypadku, gdy chcesz wykonać równoległe:
Na przykład, aby skopiować plik1 do wszystkich podkatalogów bieżącego folderu (w tym rekurencji):
Uwaga: Prawdopodobnie zapewnia to jedynie zauważalne zwiększenie prędkości w bardzo szczególnych przypadkach użycia, np. Jeśli każdy katalog docelowy jest odrębnym dyskiem.
Jest również funkcjonalnie podobny do argumentu „-P” dla xargs.
źródło
Nie, nie możesz.
Wielokrotnie odkryłem, że mogę skorzystać z tej funkcji, dlatego stworzyłem własne narzędzie, aby to dla mnie zrobić.
http://github.com/ddavison/branch
dość proste -
branch myfile dir1 dir2 dir3
źródło
/e
na przykład tylko raz na każdej maszynie, mógłbym pisać własne narzędzia i przechowywać je na zawsze.źródło
Załóżmy, że chcesz skopiować
fileName.txt
do wszystkich podkatalogów w bieżącym katalogu roboczym.Uzyskaj wszystkie nazwy podkatalogów
ls
i zapisz je w pliku tymczasowym, powiedz:allFolders.txt
Wydrukuj listę i przekaż ją do polecenia
xargs
.źródło
Innym sposobem jest użycie kota i tee w następujący sposób:
Myślę, że byłoby to dość nieefektywne, ponieważ zadanie zostanie podzielone na kilka procesów (jeden na miejsce docelowe), a dysk twardy zapisuje kilka plików jednocześnie na różnych częściach talerza. Jednak jeśli chcesz zapisać plik na kilku różnych dyskach, ta metoda prawdopodobnie byłaby dość wydajna (ponieważ wszystkie kopie mogłyby się odbywać jednocześnie).
źródło
Za pomocą skryptu bash
źródło
jeśli chcesz skopiować wiele folderów do wielu folderów, możesz zrobić coś takiego:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / ścieżka / toyourdir / {subdir1, subdir2, subdir3}
źródło
Jeśli wszystkie katalogi docelowe pasują do wyrażenia ścieżki - tak jak wszystkie podkatalogi
path/to
- użyj tegofind
w kombinacji zcp
następującymi:Otóż to.
źródło
find
w wątku.Jeśli musisz sprecyzować, do których folderów skopiować plik, możesz połączyć find z jednym lub kilkoma greps. Na przykład, aby zastąpić dowolne wystąpienia pliku favicon.ico w dowolnym podfolderze, którego możesz użyć:
źródło
Spowoduje to skopiowanie do bezpośrednich podkatalogów, jeśli chcesz wejść głębiej, dostosuj
-maxdepth
parametr.Jeśli nie chcesz kopiować do wszystkich katalogów, mam nadzieję, że możesz filtrować katalogi, które Cię nie interesują. Przykład kopiowania do wszystkich folderów zaczynających się od
a
Jeśli kopiujesz do dowolnego katalogu katalogów, będziesz potrzebować sugestii Roberta Gamble'a.
źródło
Lubię kopiować plik do wielu katalogów jako takich:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
I kopiować katalog do innych katalogów:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
Wiem, że to tak, jakby wydawać kilka poleceń, ale działa dobrze, gdy chcę wpisać linię 1 i odejść na chwilę.
źródło
Na przykład jeśli jesteś w katalogu nadrzędnym folderów docelowych, możesz:
dla i w $ (ls); zrób plik źródłowy cp $ i; Gotowe
źródło
ls
i zawsze cytuj zmienne.for i in ./*; do cp sourcefile "$i"; done