¿No es su único error el echoque no debería estar allí y el $1que debería estar $i?
Julie Pelletier
si elimino el eco y solo lo uso test$1.ogg, dice: test.ogg y test.ogg son los mismos archivos , por lo que parece que $ 1 no se reconoce.
Negro
@EdwardBlack: Parece que entendí mal tus requisitos. Esa solución no es adecuada.
Cuonglm
@JuliePelletier, maldición, a veces me sucede que escribo de manera accidental en $1lugar de $i, es temprano en la mañana, lo siento ... gracias. Lo usaré $xen el futuro en lugar de$i
Black
Respuestas:
25
Su código de shell tiene dos problemas:
El echono debería estar allí.
La variable $iestá mal escrita como $1en 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 thefiley theotherthingen el directorio llamado thecopy.
En su caso, busca específicamente un archivo llamado test.oggy uno llamado echopara copiar en el directorio test$1.ogg.
Lo $1más probable es que se expanda a una cadena vacía. Es por eso que, cuando elimina el echocomando, obtiene "test.ogg y test.ogg son los mismos archivos"; el comando que se ejecuta es esencialmente
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.
según lo sugerido por @Gilles, el uso teetiene 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:
Esto es potencialmente más rápido que las llamadas múltiples 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.
Gilles 'SO- deja de ser malvado'
@ Gilles ohh, ¿podemos superar eso?
Rahul
3
Puedes correr cp --attributes-onlydespués.
Gilles 'SO- deja de ser malvado'
@Gilles gracias, actualicé mi respuesta según su ayuda.
Rahul
FWIW ninguna de las otras respuestas utilizadas cp -ppara preservar los metadatos tampoco.
roaima 06/0617
11
for i in{1..100};do cp test.ogg "test_$i.ogg";done
Esto es lo mismo que dos respuestas anteriores y un comentario, excepto (1) la pregunta hace alrededor de 100, y su respuesta usa 10, (2) ha agregado innecesariamente las -rvfopciones cpy (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 -popció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.
echoque no debería estar allí y el$1que 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.$1lugar de$i, es temprano en la mañana, lo siento ... gracias. Lo usaré$xen el futuro en lugar de$iRespuestas:
Su código de shell tiene dos problemas:
echono debería estar allí.$iestá mal escrita como$1en el nombre del archivo de destino.Para hacer una copia de un archivo en el mismo directorio que el archivo en sí, use
Si inserta algo más allí, por ejemplo
entonces se supone que desea copiar
thefileytheotherthingen el directorio llamadothecopy.En su caso, busca específicamente un archivo llamado
test.oggy uno llamadoechopara copiar en el directoriotest$1.ogg.Lo
$1más probable es que se expanda a una cadena vacía. Es por eso que, cuando elimina elechocomando, obtiene "test.ogg y test.ogg son los mismos archivos"; el comando que se ejecuta es esencialmenteEsto es probablemente un error.
Al final, quieres algo como esto:
O como alternativa
O, usando
tee: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.
fuente
Corto y preciso
o incluso mejor hacerlo
vea el uso del comando tee para más ayuda.
Actualizar
según lo sugerido por @Gilles, el uso
teetiene 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:fuente
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-onlydespués.cp -ppara preservar los metadatos tampoco.fuente
El siguiente comando copiará el archivo. A 5 veces:
Si prefiere dd (¡no es lo mismo que cp!):
fuente
No ha llamado a la variable i al copiar
use el siguiente script. Según lo probado, funcionó bien
fuente
-rvfopcionescpy (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-popció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.