Es el shell que expande los comodines, no los comandos. Entonces, cp dir1/* dir2/*
primero expande los dos comodines, luego llama cp
al resultado. Esto no es en absoluto lo que aparentemente espera: dependiendo de cuántos archivos ya haya dir2
, dir2/*
puede expandirse a uno o más argumentos. El comando cp
no sabe cuáles de sus argumentos provienen de expandir el primer patrón y cuáles provienen de expandir el segundo patrón. Espera que su último argumento sea el nombre del directorio de destino. Por lo tanto, para copiar todos los archivos del directorio dir1
en el directorio dir2
, el último argumento debe ser el directorio dir2
:
cp dir1/* dir2
Como *
coincide con todos los archivos, cp
intenta copiar todos los archivos. Esto incluye directorios: los directorios también son archivos. Se salta los directorios, pero informa un error. Copia el contenido de archivos especiales como las canalizaciones con nombre (es mejor que algo les escriba o cp
bloquee), etc.
Para copiar solo archivos normales , debe restringir la coincidencia. En zsh, puede usar el calificador glob .
para eso:
cp dir1/*(.) dir2
Otras conchas no tienen esto. Puede usar el find
comando para filtrar los tipos de archivo. Suponiendo que esté ejecutando Linux o Cygwin no incrustado:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
En Linux, FreeBSD y OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2