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?


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.


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


32
cp dir1/* dir2

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

cp -r dir1/* dir2

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).


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).


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).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.