Chciałbym skopiować zawartość katalogu 1 do katalogu 2. Chciałbym jednak kopiować tylko pliki (a nie katalogi) z mojego katalogu 1. Jak to zrobić?
cp dir1/* dir2/*
nadal mam problem z katalogami.
Ponadto wszystkie moje pliki nie mają żadnego rozszerzenia, więc . nie załatwi sprawy
cp dir1/* dir2
lubcp -t dir2 dir1/*
Odpowiedzi:
cp
nie będzie kopiować katalogów, chyba że zostanie to wyraźnie nakazane (--recursive
na przykład zobaczman cp
).Uwaga 1:
cp
najprawdopodobniej zakończy działanie ze statusem niezerowym, ale i tak pliki zostaną skopiowane. Może to być problemem, gdy łańcuchowym poleceń na podstawie kodów wyjścia:&&
,||
,if cp -r dir1/* dir2; then ...
, itd. (Dzięki contrebis na swój komentarz na ten temat )Uwaga 2 :
cp
oczekuje, że ostatnim parametrem będzie pojedyncza nazwa pliku lub katalog. Naprawdę nie powinno być znaku wieloznacznego*
po nazwie katalogu docelowego.dir2\*
zostanie rozszerzony przez powłokę tak jakdir1\*
. Niespodziewane rzeczy będzie się zdarzyć:dir2
jest pusty i zależy od powłoki i ustawień:dir2/*
będą brane dosłownie (szukając nazwanego pliku / katalogu*
), co prawdopodobnie doprowadzi również do błędu, chyba że*
faktycznie istnieje.dir2/*
zostanie po prostu całkowicie usunięty z polecenia, pozostawiająccp dir1/*
. Które, w zależności od rozszerzeniadir1/*
, mogą nawet zniszczyć dane:dir1/*
pasuje tylko do jednego pliku lub katalogu, pojawi się błąd zcp
.dir1/*
pasuje dokładnie dwa pliki, jeden zostanie zastąpiony przez drugi ( Zły ).dir/*
pasuje do wielu plików, a ostatnie dopasowanie to, pojawi się komunikat o błędzie.dir/*
jest katalog, wszystkie pozostałe dopasowania zostaną do niego przeniesione.dir2
nie jest pusty, ponownie zależy od:dir2/*
jest katalog,dir1/*
a pozostałe dopasowaniadir2/*
zostaną przeniesione do.dir2/*
jest plik, prawdopodobnie pojawi się komunikat o błędzie, chyba żedir1/*
pasuje tylko do jednego pliku.źródło
$ cp dir1/* dir2
->cp: dir1/isadir is a directory (not copied).
dla mnie wychodzi ze statusem 1.cp
to kopiuje pliki pasującedir1/*
do każdego systemu, który sprawdziłem: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 i 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 i 10 (gdziecp
faktycznie wychodzi z kodem 2). To zachowanie nie jest ani nowe (SuSE 8.1 pochodzi z 2002 r.), Ani nie ogranicza się do Linuksa.cp
kończy działanie z niezerowym kodem wyjścia, ponieważ nie mógł zrobić wszystkiego , co mu kazano. To nie znaczy, że nic nie robi .&&
tym, może to powodować problem. Próbowałem coś takiego, choć nie pamiętam teraz kontekstu.*
zawiera ukryte pliki, lub jak dołączyć ukryte pliki, zależy od powłoki. Jeśli*
nie zawiera ukrytych plików, możesz je dopasować.*
. Zauważ, że ten będzie obejmował.
i..
nabash
idash
, ale nie nazsh
. W kontekście tej odpowiedzi możesz uciec,cp dir1/* dir1/.* dir2
ponieważ.
i..
są katalogami i nie zostaną skopiowane.zsh
można również włączyć do niego ukryte pliki*(D)
.To powłoka rozwija symbole wieloznaczne, a nie polecenia. Więc
cp dir1/* dir2/*
najpierw rozwija dwie symbole wieloznaczne, a następnie wywołujecp
wynik. To nie jest to, czego się najwyraźniej spodziewasz: w zależności od liczby plików, które już tam sądir2
,dir2/*
może rozwinąć się do jednego lub więcej argumentów. Poleceniecp
nie wie, które z jego argumentów pochodzą z rozwinięcia pierwszego wzorca, a które z rozwinięcia drugiego wzorca. Oczekuje, że ostatnim argumentem będzie nazwa katalogu docelowego. Zatem, aby skopiować wszystkie pliki z katalogudir1
do katalogudir2
, ostatnim argumentem musi być katalogdir2
:Ponieważ
*
pasuje do wszystkich plików,cp
próbuje skopiować wszystkie pliki. Obejmuje to katalogi: katalogi też są plikami. Pomija katalogi, ale zgłasza błąd. Kopiuje zawartość specjalnych plików, takich jak nazwane potoki (coś lepiej do nich pisać, lubcp
będzie blokować) itp.Aby skopiować tylko zwykłe pliki, musisz ograniczyć dopasowanie. W zsh możesz użyć do tego kwalifikatora glob
.
:Inne muszle tego nie mają. Możesz użyć
find
polecenia do filtrowania według typów plików. Zakładając, że korzystasz z niewbudowanego systemu Linux lub Cygwin:W systemach Linux, FreeBSD i OSX:
źródło
-maxdepth 1
. Czy istnieje sposób rekurencyjnego kopiowania i zachowania oryginalnej hierarchii katalogów w katalogu docelowym?-maxdepth 1
Thefind
komenda będzie rekursja do podkatalogów, których nie chciano tu. Jeśli chcesz skopiować całe drzewo katalogów, w tym podkatalogów, to zupełnie inna kwestia, a odpowiedź jest dużo prostsza:cp -a dir1 dir2
.Poniżej znajduje się polecenie skopiowania pliku ze źródła do katalogu docelowego.
Przejdź do folderu źródłowego, a następnie napisz poniżej polecenie:
$ cp fileName destination directory path
Przykład:
źródło