2010-03-23 11 views

Respuesta

9

No se puede adjuntar al comienzo de un archivo sin reescribiendo el archivo. La primera forma en que diste es la forma correcta de hacerlo.

0

Gracias a la búsqueda correcta!

echo "include .headers.java\n$(cat fileObject.java)" > fileObject.java 

Luego, con un archivo:

echo "$(cat .headers.java)\n\n$(cat fileObject.java)" > fileObject.java 
+2

que contiene una condición de carrera, a veces (si no siempre), el shell configurará su redirección estándar, que pondrá a cero el archivo, antes el segundo comando "cat" está completo. – pra

+0

@pra: ¿corregido? $ echo "$ (leer -t 1; cat one) \ n \ n $ (cat two)"> one? – hhh

1

No se puede anteponer a un archivo sin necesidad de leer todos los contenidos del archivo y escribir un nuevo archivo con sus + contenidos de texto antepuesto el archivo. Piense en un archivo en Unix como una secuencia de bytes: es fácil agregarlo al final de una secuencia, pero no hay una operación fácil para "rebobinar" la secuencia y escribir en ella. Incluso una operación de búsqueda al principio del archivo sobrescribirá el comienzo de cualquier dato que escriba.

3

Esto es fácil de hacer en SED si se puede incrustar la cadena de encabezado directamente en el comando:

$ sed -i "1iheader1,header2,header3" 

O si realmente desea leer desde un archivo, puede hacerlo con la ayuda de bash:

$ sed -i "1i$(<header)" file 

TEN CUIDADO que "-i" sobrescribe el archivo de entrada con los resultados. Si desea que sed haga una copia de seguridad, cámbiela a "-i.bak" o similar, y por supuesto siempre pruebe primero con datos de muestra en un directorio temporal para asegurarse de que comprende lo que sucederá antes de aplicar a sus datos reales. .

2

Todo el archivo ficticio es bastante molesto. Aquí hay una solución de 1 línea que acabo de probar y que parece funcionar.

echo "`cat header file`" > file 

Los ticks hacen que las cotizaciones dentro de la pieza se ejecuten primero para que no se queje de que el archivo de salida sea un archivo de entrada. Parece relacionado con la solución de hhh pero un poco más corto. Supongo que si los archivos son realmente grandes, esto podría causar problemas, porque parece que he visto al caparazón quejarse de los tics que hacen comandos demasiado tiempo antes. En algún lugar, la parte que se ejecuta primero debe almacenarse en un búfer para poder sobrescribir el original, pero no soy lo suficientemente experto como para saber qué/dónde sería ese búfer o qué tan grande podría ser.

+0

ACTUALIZACIÓN: Este enfoque parece haber destruido algunos archivos fuente en los que estaba tratando de adjuntar un aviso de copyright. Parece que se ha detenido cuando encontró comillas simples en los archivos fuente y convirtió secuencias de escape en los caracteres. Supongo que no es tan útil. – Rob

+0

ACTUALIZACIÓN 2: El comando parece funcionar bien desde la línea de comandos, pero estaba interpretando las secuencias de escape de un script que estaba usando para anexar muchos archivos a la vez. Al principio pensé que no estaba usando el "echo -E" predeterminado, pero eso aún no lo solucionó. Aparentemente, el problema tenía que ver con el uso de '# \ bin \ sh' en el comienzo del script. Desde una línea de comando 'sh' en lugar de 'bash', las secuencias de escape se interpretan todo el tiempo. Modifiqué mi script para que la primera línea fuera '# \ bin \ bash' y las cosas parecieran funcionar correctamente. Moral: problemático con sh ... ¿no estoy seguro de por qué? – Rob

1

Una posibilidad es utilizar un documento interno:

cat > "prependedfile" << ENDENDEND 
prepended line(s) 
`cat "file"` 
ENDENDEND 

Puede haber una limitación de memoria a este truco.

0

si desea pre-pend "cabecera" para "presentar" por qué no añadir "archivo" a "Encabezado"

cat file >> header 
0

A continuación se muestra un simple intento de c-shell para resolver este problema. Este "prepend.sh" script recibe dos parámetros:.

  • $ 1 - El archivo que contiene la pre añadiendo redacción al
  • $ 2 - El archivo/objetivo original de ser modificado
#!/bin/csh 
if (if ./tmp.txt) then 
    rm ./tmp.txt 
endif 

cat $1 > ./tmp.txt 
cat $2 >> ./tmp.txt 

mv $2 $2.bak 
mv ./tmp.txt $2 
Cuestiones relacionadas