Intento duplicar un archivo de video x veces desde la línea de comando usando un bucle for, lo he intentado así, pero no funciona:
for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
Su código de shell tiene dos problemas:
echo
no debería estar allí.$i
está mal escrita como $1
en el nombre del archivo de destino.Para hacer una copia de un archivo en el mismo directorio que el archivo en sí, use
cp thefile thecopy
Si inserta algo más allí, por ejemplo
cp thefile theotherthing thecopy
entonces se supone que desea copiar thefile
y theotherthing
en el directorio llamado thecopy
.
En su caso, busca específicamente un archivo llamado test.ogg
y uno llamado echo
para copiar en el directorio test$1.ogg
.
Lo $1
más probable es que se expanda a una cadena vacía. Es por eso que, cuando elimina el echo
comando, obtiene "test.ogg y test.ogg son los mismos archivos"; el comando que se ejecuta es esencialmente
cp test.ogg test.ogg
Esto es probablemente un error.
Al final, quieres algo como esto:
for i in {1..100}; do cp test.ogg "test$i.ogg"; done
O como alternativa
i=0
while (( i++ < 100 )); do
cp test.ogg "test$i.ogg"
done
O, usando tee
:
tee test{1..100}.ogg <test.ogg >/dev/null
Nota: Esto probablemente funcionaría para 100 copias, pero para miles de copias puede generar un error de "lista de argumentos demasiado larga". En ese caso, vuelva a usar un bucle.
Corto y preciso
< test.ogg tee test{1..100}.ogg
o incluso mejor hacerlo
tee test{1..100}.ogg < test.ogg >/dev/null
vea el uso del comando tee para más ayuda.
Actualizar
según lo sugerido por @Gilles, el uso tee
tiene el defecto de no preservar ningún metadato de archivo. Para superar ese problema, es posible que deba ejecutar el siguiente comando después de eso:
cp --attributes-only --preserve Source Target
cp
(depende del tamaño del archivo en relación con la memoria disponible), pero tiene el defecto de no preservar ningún metadato de archivo.
cp --attributes-only
después.
cp -p
para preservar los metadatos tampoco.
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
El siguiente comando copiará el archivo. A 5 veces:
$ seq 5 | xargs -I AA cp file.a fileAA.a
Si prefiere dd (¡no es lo mismo que cp!):
$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a
No ha llamado a la variable i al copiar
use el siguiente script. Según lo probado, funcionó bien
for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done
-rvf
opciones cp
y (3) no ha citado su expansión variable . (También tenga en cuenta que es convencional tener un espacio entre los signos de puntuación como ;
y la siguiente palabra.) La adición de la -p
opción es valiosa, pero (4a) ya se ha abordado (en comentarios), y (4b) su respuesta no es útil si no explicas lo que estás haciendo.
echo
que no debería estar allí y el$1
que debería estar$i
?test$1.ogg
, dice: test.ogg y test.ogg son los mismos archivos , por lo que parece que $ 1 no se reconoce.$1
lugar de$i
, es temprano en la mañana, lo siento ... gracias. Lo usaré$x
en el futuro en lugar de$i