¿Por qué esto funciona en un bucle for de shell pero no por sí solo?

¿Por qué esto funciona en un bucle for de shell pero no por sí solo?

¿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*.txtpieza amúltiplerutas antes de pasar al comando que se está invocando ( cpen 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*.txtparte puede expandirse o no dependiendo de si existe algo en el outputdirectorio 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 cpcuando 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.

información relacionada