Me gustaría copiar un contenido del directorio 1 al directorio 2. Sin embargo, me gustaría copiar solo archivos (y no directorios) de mi directorio 1. ¿Cómo puedo hacer eso?
cp dir1/* dir2/*
entonces todavía tengo el problema de los directorios.
Además, todos mis archivos no tienen ninguna extensión, entonces . no hará el truco
cp dir1/* dir2
ocp -t dir2 dir1/*
Respuestas:
cp
no copiará directorios a menos que se le indique explícitamente que lo haga (con,--recursive
por ejemplo, verman cp
).Nota 1:
cp
lo más probable es que salga con un estado distinto de cero, pero los archivos se habrán copiado de todos modos. Esto puede ser un problema cuando el encadenamiento de comandos basado en códigos de salida:&&
,||
,if cp -r dir1/* dir2; then ...
, etc (Gracias a contrebis para su comentario sobre esta cuestión )Nota 2 :
cp
espera que el último parámetro sea un único nombre de archivo o directorio. Realmente no debería haber ningún comodín*
después del nombre del directorio de destino.dir2\*
será expandido por el shell al igual quedir1\*
. Cosas inesperadas van a suceder:dir2
está vacío y depende de su shell y configuración:dir2/*
se tomará literalmente (buscando un archivo / directorio llamado*
), lo que probablemente también conducirá a un error, a menos que*
realmente exista.dir2/*
simplemente se eliminará del comando por completo, dejandocp dir1/*
. Lo cual, dependiendo de la expansión dedir1/*
, incluso puede destruir datos:dir1/*
solo coincide con un archivo o directorio, obtendrá un error decp
.dir1/*
coincide exactamente con dos archivos, uno será sobrescrito por el otro ( Malo ).dir/*
coincide con varios archivos y la última coincidencia es a, recibirá un mensaje de error.dir/*
es un directorio, todas las demás coincidencias se moverán a él.dir2
no está vacío, nuevamente depende de:dir2/*
es un directorio,dir1/*
y las otras coincidencias dedir2/*
se moverán a.dir2/*
es un archivo, probablemente recibirá un mensaje de error, a menos quedir1/*
solo coincida con un archivo.fuente
$ cp dir1/* dir2
->cp: dir1/isadir is a directory (not copied).
salidas con estado 1 para mí.cp
copia los archivos que coincidendir1/*
en cada sistema que verifiqué: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 y 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 y 10 (donde encp
realidad sale con el código 2). Por lo tanto, este comportamiento no es nuevo (SuSE 8.1 es de 2002) ni está limitado a Linux.cp
sale con un código de salida distinto de cero porque no podía hacer todo lo que le dijeron que hiciera. Eso no significa que no haga nada .&&
esto, puedes causar un problema. Estaba tratando de hacer algo como esto, aunque no puedo recordar el contexto ahora.*
incluye archivos ocultos o cómo incluir archivos ocultos depende del shell. Si*
no incluye archivos ocultos, puede asociarlos con.*
. Tenga en cuenta que esto incluirá.
y..
enbash
ydash
, pero no enzsh
. En el contexto de esta respuesta puede salirse con lacp dir1/* dir1/.* dir2
causa.
y..
son directorios y no será copiado.zsh
También se puede hacer que incluya archivos ocultos con*(D)
.Es el shell que expande los comodines, no los comandos. Entonces,
cp dir1/* dir2/*
primero expande los dos comodines, luego llamacp
al resultado. Esto no es en absoluto lo que aparentemente espera: dependiendo de cuántos archivos ya hayadir2
,dir2/*
puede expandirse a uno o más argumentos. El comandocp
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 directoriodir1
en el directoriodir2
, el último argumento debe ser el directoriodir2
: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 ocp
bloquee), etc.Para copiar solo archivos normales , debe restringir la coincidencia. En zsh, puede usar el calificador glob
.
para eso: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:En Linux, FreeBSD y OSX:
fuente
-maxdepth 1
? Además, ¿hay alguna manera de copiar y preservar recursivamente la jerarquía de directorios original en el directorio de destino?-maxdepth 1
, elfind
comando volvería a aparecer en subdirectorios, que no se deseaban aquí. Si desea copiar todo el árbol de directorios incluyendo los subdirectorios, que es una cuestión totalmente diferente, y la respuesta es mucho más simple:cp -a dir1 dir2
.A continuación se muestra el comando para copiar el archivo del directorio de origen al de destino.
Vaya a la carpeta de origen y luego escriba el siguiente comando:
$ cp fileName destination directory path
Ejemplo:
fuente