¿Por qué funciona esto?
for X in A* ; do cp $X/output.txt output/$X.txt ; done
pero no esto
cp A*/output.txt output/A*.txt
Para copiar el archivo Output.txt de varias carpetas llamadas A1, A2, A3, A4, etc. en una carpeta combinada llamada "Salida", dando a cada archivo de texto el nombre de la carpeta de donde proviene.
Respuesta1
Debido a que el caparazón expande la A*.txt
pieza amúltiplerutas antes de pasar al comando que se está invocando ( cp
en este caso).
Esto significa que en el primer caso, si tiene archivos llamados A1.txt, A2.txt, A3.txt y A4.txt y directorios A1, A2, A3 y A4, cada uno de los cuales contiene output.txt, se expandirá aalgo como:
for X in A1.txt A2.txt A3.txt A4.txt ; do cp $X/output.txt output/$X.txt ; done
y en el segundo caso, se expande a:
cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A*.txt
donde la output/A*.txt
parte puede expandirse o no dependiendo de si existe algo en el output
directorio que coincida con el globo. Si es así, se pone aún peor, como:
cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A8.txt output/A9.txt
Desde cp
cuando se le dan varios archivos fuente, quiere un destinodirectorioal final, no sabe cómo manejar esto y simplemente se da por vencido y en su lugar le da un error.
Respuesta2
La razón es que, si hay más de dos argumentos cp
, el últimodebeser un directorio. Elpágina de manual de cpestados:
Sinopsis
cp [OPCIÓN]... [-T] FUENTE DESTINO
cp [OPCIÓN]... FUENTE... DIRECTORIO
cp [OPCIÓN]... -t FUENTE DEL DIRECTORIO...
Descripción
Copie FUENTE a DESTINO, o varias FUENTES al DIRECTORIO.
El comando que escribiste,
cp file1 file2 file3 file4
pretendía significar
cp file1 file3; cp file2 file4
pero no es así, por el motivo anterior. En cambio, el bucle for produce exactamente las 2 declaraciones inmediatamente anteriores, que es lo que realmente desea.