To powłoka rozwija symbole wieloznaczne, a nie polecenia. Więc cp dir1/* dir2/*
najpierw rozwija dwie symbole wieloznaczne, a następnie wywołuje cp
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. Polecenie cp
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 katalogu dir1
do katalogu dir2
, ostatnim argumentem musi być katalog dir2
:
cp dir1/* dir2
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ć, lub cp
będzie blokować) itp.
Aby skopiować tylko zwykłe pliki, musisz ograniczyć dopasowanie. W zsh możesz użyć do tego kwalifikatora glob .
:
cp dir1/*(.) dir2
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:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
W systemach Linux, FreeBSD i OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2