Es una pregunta seria. Pruebo algunos awk
scripts y necesito archivos con una nueva línea en sus nombres.
¿Es posible agregar una nueva línea en un nombre de archivo con mv
?
Ahora, puedo hacer esto con touch
:
touch "foo
bar"
Con el toque agregué el carácter de nueva línea por copiar y pegar. Pero no puedo escribir foo
Returnbar
en mi caparazón.
¿Cómo puedo cambiar el nombre de un archivo para tener una nueva línea en el nombre del archivo?
Editar 28/06/2015; 07:08 pm
Para agregar una nueva línea zsh
, puedo usar, Alt+Return
mv
sería diferente de hacerlotouch
? ¿Intentaste lo mismo?mv
comando tan fácilmente comotouch
.Respuestas:
Es una mala idea (tener caracteres extraños en los nombres de los archivos) pero podría hacerlo
(también se podría haber hecho
mv somefile.txt "$(printf "foo\nbar")"
omv somefile.txt foo$'\n'bar
, etc ... detalles son específicos a su concha. Estoy usandozsh
)Lea más sobre globbing , por ejemplo, glob (7) . Los detalles pueden ser específicos del shell. Pero comprenda que
/bin/mv
está dado (por su shell), a través de execve (2) , una matriz expandida de argumentos: la expansión de argumentos y el globbing es responsabilidad del shell que invoca.E incluso podría codificar un pequeño programa en C para hacer lo mismo:
Guarde el programa anterior en
foo.c
, compílelo ygcc -Wall foo.c -o foo
luego ejecútelo./foo
Del mismo modo, puede codificar un script similar en Perl, Ruby, Python, Ocaml, etc.
Pero esa es una mala idea. Evite las nuevas líneas en los nombres de archivo (confundirá al usuario y podría romper muchos scripts).
En realidad, incluso recomiendo usar solo letras, dígitos y
+-/._%
caracteres no acentuados (/
siendo el separador de directorio) en las rutas de archivo. Los archivos "ocultos" (que comienzan con.
) deben usarse con precaución y parcimony. Creo que usar cualquier tipo de espacio en un nombre de archivo es un error. Utilice un guión bajo en su lugar (pfoo/bar_bee1.txt
. Ej. ) O un signo menos (pfoo/bar-bee1.txt
. Ej. )fuente
foo
.@
y,
sería más inofensivo que-
(como en la primera posición) o%
. Todas esas recomendaciones son principalmente para evitar errores en algunas aplicaciones (que rompen los nombres de archivo que de otra manera serían válidos desde el punto de vista del sistema operativo). Se siente al revés pedirle a la gente que no use esos personajes en lugar de arreglar sus errores.Si usa bash, este comando debería funcionar.
fuente
zsh
también con =)Sé que solicitó una
mv
solución, sin embargo, a pesar de la advertencia, esto se puede hacer fácilmente conrename
(en el paquete Perl):fuente
rename
, una muy buena idea. +1Un aspecto de este problema no se trata realmente
awk
, y solo un poco sobre el shell. El problema es que, en un tty canónico estándar, la mayoría de las veces la disciplina de tty del kernel está amortiguando su entrada, simplemente haciéndola eco en su pantalla y en ningún otro lugar, para que pueda manejar eficientemente el retroceso y cosas por el estilo.Sin embargo, cuando presiona Intro o ingresa una nueva línea, todos esos datos almacenados en el búfer se envían a la vez a la aplicación de lectura, generalmente su shell. Puede observar esto observando
$PS2
después de ingresar una cita pendiente. Cuando el shell se imprime$PS2
es porque solo lee un bloque de su entrada y aún no está convencido de que haya terminado.Por lo tanto, para mayor comodidad, lo que necesita es alguna forma de enviar una línea
\n
electrónica al búfer de terminal sin tener que presionar toda esa otra entrada de inmediato. La forma estándar de hacerlo es con la secuencia de teclasCTRL+V
, que cita para el terminal su próximo carácter de entrada. HacerCTRL+V
a continuación,CTRL+J
- porque esta última es por lo general cómo escribir un literal\n
ewline. Sabrás que funciona cuando no ves$PS2
porque el shell todavía no ha leído tu entrada.Nota sin embargo que cuando no leyó que la entrada de su anterior
CTRL+V
habrá hecho ninguna diferencia para la cáscara del todo - que sólo lo cita para la línea-disciplina. Definitivamente querrás citar la nueva línea para hacer algo significativo con ella.Por cierto,
CTRL+V
se puede aplicar útilmente de otras maneras, por ejemplo,"$(printf \\33)"
no es la única forma de escribir unESC
personaje en un script de shell, y ni siquiera es la más simple. Literalmente, puede ingresar cualquier carácter que su teclado enviará sin que el controlador de entrada intente interpretarlo si primero lo escapa de esta manera.A menudo me gusta usar <tab> s en la línea de comandos sin que el shell intente completar nada. Debido a que los shells que completan generalmente configurarán <tab> de una manera que
stty eol \t
, para que sus sistemas de finalización funcionen,CTRL+V
me funciona incluso en entornos desconocidos.fuente