To powłoka rozwija symbole wieloznaczne, a nie polecenia. Więc cp dir1/* dir2/*najpierw rozwija dwie symbole wieloznaczne, a następnie wywołuje cpwynik. 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 cpnie 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 dir1do katalogu dir2, ostatnim argumentem musi być katalog dir2:
cp dir1/* dir2
Ponieważ *pasuje do wszystkich plików, cppró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 cpbę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ć findpolecenia 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