Skopiuj pliki z jednego katalogu do istniejącego katalogu

248

W bash muszę to zrobić:

  1. weź wszystkie pliki z katalogu

  2. skopiuj je do istniejącego katalogu

Jak mam to zrobic? Próbowałem cp -r t1 t2(zarówno t1, jak i t2 to istniejące katalogi, t1 zawiera pliki), ale utworzyłem katalog o nazwie t1 wewnątrz t2, nie chcę tego, potrzebuję plików w t1, aby przejść bezpośrednio do t2. Jak mam to zrobic?

David Chang
źródło
11
Dlaczego to było zamknięte? Dowolne jest, jeśli polecenie bash jest poleceniem wbudowanym lub zewnętrznym (np. Printf istnieje jako oba w większości systemów), więc cppytania mogą być postrzegane jako bashpytania, które są językiem programowania. Nigdy nie widziałem, aby pytanie Pythona mówiące o kopiowaniu plików było zamknięte.
Ciro Santilli 9 冠状 病 六四 事件 法轮功 法轮功
Przybyłem w poszukiwaniu przypomnienia o składni polecenia kopiowania powłoki Bash i cieszę się, że te polecenia wydają się również działać przeciwko bazowemu systemowi plików NTFS w mojej instalacji Windows.
David A. Gray,

Odpowiedzi:

396

Co chcesz to:

cp -R t1/. t2/

Kropka na końcu informuje go o skopiowaniu zawartości bieżącego katalogu, a nie samego katalogu. Ta metoda obejmuje również ukryte pliki i foldery.

Nacięcie
źródło
2
Naprawdę podoba mi się ta składnia, ale z jakiegoś powodu nie działa mv. Czy ktoś wie dlaczego?
Martin von Wittich,
2
Niesamowity. Gdzie to jest udokumentowane? Czy to POSIX czy rozszerzenie?
Ciro Santilli 9 冠状 病 六四 事件 法轮功
9
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Jeśli skopiujesz katalog, cp utworzy katalog i skopiuje do niego wszystkie pliki. Jeśli użyjesz folderu udającego o nazwie „.”, Który jest taki sam, jak katalog, w którym jest przechowywany, kopia zachowuje się w ten sposób. Powiedzmy, że t1 zawiera plik o nazwie „plik”. cp wykona operację równoważną „cp t1 /./ plik t2 /./”. Kopiuje folder „.”, Ale kopiuje pliki do „t2” „.” folder usuwa „./”, ponieważ „t2 /./” jest taki sam jak „t2 /”. Technicznie oznacza to, że ma wbudowane zachowanie POSIX ... ale prawdopodobnie nie tak, jak można się było spodziewać!
uderzenie
35

Jeśli chcesz skopiować coś z jednego katalogu do bieżącego katalogu, wykonaj następujące czynności:

cp dir1/* .

Zakłada się, że nie próbujesz kopiować ukrytych plików.

Karl Giesing
źródło
20
Brakuje ukrytych plików.
Ciro Santilli 9 冠状 病 六四 事件 法轮功 法轮功
1
Również nie dla dużej liczby plików (ponieważ „*” nie nie można rozwinąć do nieskończenie wielu plików ..) y
moritzschaefer
32
cp dir1/* dir2

Lub jeśli masz katalogi w katalogu 1, które również chcesz skopiować

cp -r dir1/* dir2
Bertrand Marron
źródło
3
W zależności od konfiguracji powłoki prawdopodobnie będziesz musiał użyć „dir1 / * dir1 /.*” zamiast „dir1 / *”, jeśli chcesz również przechwytywać ukryte pliki.
ssokolow
2
Kopiowanie dir1/.*nie jest dobrym pomysłem, ponieważ kopiuje katalog1 / .. (tzn. Rodzic katalogu, który próbujesz skopiować). Kopiuje również dir1 /. co jest w porządku, poza tym, że zostało już (głównie) skopiowane, więc wykonujesz pracę dwa razy.
Gordon Davisson,
1
Możesz obejść dir1/.*problem z / ukrytymi plikami, zapisując płyty CD w katalogu, z którego chcesz skopiować, a następnie nazywając to .. Tak więc, jeśli chcesz skopiować wszystkie pliki, w tym ukryte pliki z katalogu do istniejącego katalogu, możesz: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW,
8

Zakładając, że t1 to folder z plikami, a t2 to pusty katalog. To, czego chcesz, to coś takiego:

sudo cp -R t1/* t2/

Pamiętaj, że w pierwszym przykładzie t1 it2 muszą być ścieżkami pełnymi lub ścieżkami względnymi (zależnie od tego, gdzie jesteś). Jeśli chcesz, możesz przejść do pustego folderu (t2) i zrobić to:

sudo cp -R t1/* ./

Lub możesz przejść do folderu z plikami (t1) i zrobić to:

sudo cp -R ./* t2/

Uwaga: znak * (lub symbol wieloznaczny) oznacza wszystkie pliki i foldery. Flaga -R oznacza rekurencyjnie (wszystko we wszystkim).

Konkret
źródło
2
cp -R t1/ t2

Końcowy ukośnik w katalogu źródłowym nieznacznie zmienia semantykę, więc kopiuje zawartość, ale nie sam katalog. Pozwala to również uniknąć problemów z globowaniem i niewidzialnymi plikami, które ma odpowiedź Bertranda (kopiowanie t1/*pomija niewidzialne pliki, kopiowanie `t1 / * t1 /.* 'kopiuje t1 /. I t1 / .., których nie chcesz).

Gordon Davisson
źródło
Twoje rozwiązanie nie działa, przynajmniej nie w mojej instalacji (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (przepraszam, nie ma formatu kodu w komentarzach, czytelna wersja na pastebin.com/yszSxV6G )
zpon
2

W zależności od niektórych szczegółów może być konieczne zrobienie czegoś takiego:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... to zasadniczo zmienia katalog SRC i kopiuje go do celu, a następnie wraca do miejsca, z którego zacząłeś.

Dodatkowe zamieszanie polega na obsłudze względnych lub bezwzględnych celów.

(Nie opiera się to na subtelnej semantyce samego cppolecenia ... o tym, jak obsługuje specyfikacje źródłowe ze znakiem końcowym lub bez / /, ponieważ nie jestem pewien, czy są one stabilne, przenośne i niezawodne poza GNU cpi I nie wiem, czy tak będzie w przyszłości).

Jim Dennis
źródło
1

W przypadku niektórych katalogów zostanie to wykorzystane jako pełne, ponieważ kopiuje całą zawartość z „folderu 1” do nowego katalogu „folder2” w jakimś katalogu.

$ (pwd) otrzyma ścieżkę do bieżącego katalogu.

Zwróć uwagę na kropkę (.) Za folderem 1, aby uzyskać całą zawartość folderu 1

cp -r $(pwd)/folder1/. $(pwd)/folder2
Bidyashish Kumar
źródło