Shell yang mengembang wildcard, bukan perintah. Jadi cp dir1/* dir2/*
pertama-tama perluas dua wildcard, lalu panggil cp
hasilnya. Ini sama sekali tidak seperti yang Anda harapkan: tergantung pada berapa banyak file yang sudah ada dir2
, dir2/*
dapat berkembang menjadi satu atau lebih argumen. Perintah cp
tidak tahu argumen mana yang berasal dari memperluas pola pertama dan mana yang berasal dari memperluas pola kedua. Ia mengharapkan argumen terakhirnya menjadi nama direktori tujuan. Jadi, untuk menyalin semua file dari direktori dir1
ke direktori dir2
, argumen terakhir harus direktori dir2
:
cp dir1/* dir2
Karena *
cocok dengan semua file, cp
upaya untuk menyalin semua file. Ini termasuk direktori: direktori juga file. Itu melompati direktori, tetapi melaporkan kesalahan. Ini menyalin konten file khusus seperti pipa bernama (sesuatu yang lebih baik menulis kepada mereka, atau cp
akan memblokir), dll.
Untuk hanya menyalin file biasa , Anda perlu membatasi kecocokan. Di zsh, Anda dapat menggunakan kualifikasi glob .
untuk itu:
cp dir1/*(.) dir2
Kerang lain tidak memiliki ini. Anda dapat menggunakan find
perintah untuk memfilter pada jenis file. Dengan asumsi bahwa Anda menjalankan Linux atau Cygwin yang tidak tertanam:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
Di Linux, FreeBSD dan OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2