É uma pergunta séria. Testo alguns awk
scripts e preciso de arquivos com uma nova linha em seus nomes.
É possível adicionar uma nova linha em um nome de arquivo mv
?
Agora eu posso fazer isso com touch
:
touch "foo
bar"
Com o toque, adicionei o caractere de nova linha por copiar e colar. Mas não consigo escrever foo
Returnbar
na minha concha.
Como posso renomear um arquivo para ter uma nova linha no nome do arquivo?
Editar 28/06/2015; 19:08
Para adicionar uma nova linha em zsh
que eu posso usar, Alt+Return
mv
seria diferente de fazê-lotouch
? Você tentou a mesma coisa?mv
comando com a mesma facilidadetouch
.Respostas:
É uma má ideia (ter caracteres estranhos nos nomes dos arquivos), mas você pode fazer
(você também pode ter feito
mv somefile.txt "$(printf "foo\nbar")"
oumv somefile.txt foo$'\n'bar
, etc ... detalhes são específicos do seu shell. Estou usandozsh
)Leia mais sobre globbing , por exemplo, glob (7) . Os detalhes podem ser específicos do shell. Mas entenda que
/bin/mv
é fornecido (pelo seu shell), via execve (2) , uma matriz expandida de argumentos: expansão de argumentos e globbing são de responsabilidade do shell de chamada.E você pode até codificar um pequeno programa C para fazer o mesmo:
Salve o programa acima
foo.c
, compile-ogcc -Wall foo.c -o foo
e execute./foo
Da mesma forma, você pode codificar um script semelhante em Perl, Ruby, Python, Ocaml, etc.
Mas isso é uma péssima ideia. Evite novas linhas nos nomes de arquivos (isso confundirá o usuário e poderá quebrar muitos scripts).
Na verdade, eu recomendo usar apenas letras, dígitos e
+-/._%
caracteres não acentuados (/
sendo o separador de diretório) nos caminhos dos arquivos. Arquivos "ocultos" (começando com.
) devem ser usados com cautela e parcimônia. Acredito que usar qualquer tipo de espaço em um nome de arquivo seja um erro. Use um sublinhado (por exemplofoo/bar_bee1.txt
) ou um sinal de menos (por exemplofoo/bar-bee1.txt
)fonte
foo
.@
e,
seria mais inofensivo do que-
(como na primeira posição) ou%
. Todas essas recomendações são principalmente para solucionar bugs em alguns aplicativos (que quebram em nomes de arquivos que são válidos do ponto de vista do SO). É um retrocesso pedir às pessoas que não usem esses caracteres em vez de corrigir seus erros.Se você usar o bash, este comando deve funcionar.
fonte
zsh
também com =)Eu sei que você pediu uma
mv
solução, no entanto, apesar do aviso, isso pode ser feito facilmente comrename
(no pacote Perl):fonte
rename
boa ideia. +1Um aspecto desse problema não é realmente
awk
- e apenas um pouco sobre o shell. O problema é que em um tty canônico padrão, na maioria das vezes, a disciplina tty do kernel está armazenando sua entrada em buffer - apenas ecoando-a na tela e em nenhum outro lugar - para que ele possa lidar com eficiência no backspacing e afins.No entanto, quando você pressiona return ou insere uma nova linha, todos esses dados em buffer são enviados de uma só vez para o aplicativo de leitura - geralmente seu shell. Você pode observar isso observando
$PS2
depois de inserir uma cotação pendente. Quando o shell é impresso$PS2
, é porque ele acabou de ler algum bloco de sua entrada e ainda não está convencido de que você terminou.Portanto, por conveniência, o que você precisa é de uma maneira de enviar uma linha de
\n
ew para o buffer do terminal sem precisar enviar todas as outras entradas imediatamente. A maneira padrão de fazer isso é com a sequência de teclasCTRL+V
- que cita para o terminal seu próximo caractere de entrada. FaçaCTRL+V
issoCTRL+J
- porque o último é geralmente como digitar um\n
ewline literal . Você saberá que funcionou quando não vê,$PS2
porque o shell ainda não leu sua entrada.Nota no entanto, que quando se lê que a entrada de seu mais cedo
CTRL+V
terá feito nenhuma diferença para o shell em tudo - que só cita-lo para a linha-disciplina. Você definitivamente vai querer citar a nova linha, além de fazer algo significativo com ela.A propósito,
CTRL+V
pode ser útil de outras maneiras - por exemplo,"$(printf \\33)"
não é a única maneira de escrever umESC
personagem em um shell script - e nem é a mais simples. Você pode literalmente digitar qualquer caractere que o teclado enviará sem que o driver de entrada tente interpretá-lo se você apenas escapar dessa maneira.Costumo usar <tab> s na linha de comando sem que o shell tente concluir nada. Como os shells que fazem a conclusão normalmente configuram o <tab> de uma maneira sinônimo de
stty eol \t
, para fazer com que seus sistemas de conclusão funcionem,CTRL+V
funciona para mim mesmo em ambientes desconhecidos.fonte