Unix: arquivos começando com um traço, -

19

Ok, eu tenho um monte de arquivos começando com um traço, -. O que não é tão bom ... e quero renomeá-los. No meu caso particular, eu gostaria de colocar um personagem na frente deles.

Eu encontrei a seguinte linha que deve funcionar, mas por causa disso não funciona:

for file in -N*.ext; do mv $file x$file; done

Se eu colocar um echona frente, mveu recebo um monte de

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

O que está correto, exceto, é claro, que o primeiro nome do arquivo é opções. Então, quando eu removo echoe o executo, recebo um monte de

mv: illegal option -- N

Eu tentei mudar para

for file in -N*.ext; do mv "$file" "x$file"; done

mas as aspas são apenas ignoradas, parece. Tentei usar aspas simples, mas a variável não foi expandida ... O que faço aqui?

Atualização: agora também tentei citar as aspas. Como isso:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

E quando eu ecoo isso, parece correto, mas quando eu realmente corro isso, eu apenas

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

Eu não tenho idéia de como fazer isso agora ... suspiro

Svish
fonte

Respostas:

28

Você precisa usar a palavra --- chave para informar ao comando mv que os argumentos não devem ser interpretados como opções. Ver:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

Use -- depois de todas as opções na linha de comando. Por exemplo, se você está tentando usar a -iopção para mv , ela seria anterior -- :

mv -i -- -filename-begins-with-dash newfilename
charlatão quixote
fonte
6
Aaah. Não pensei nisso. Enquanto isso, descobri que também podia ficar ./na frente do nome do arquivo, o que funcionaria. Mas esta é, naturalmente, uma opção mais limpa mesmo :)
Svish
@ Skish: isso é justo, eu não pensei em acrescentar o nome do arquivo com ./qualquer um. mas você está correto, isso também funciona para esta situação.
quack quixote
7
Observe que o --significado não processa argumentos adicionais, pois as opções são uma convenção e não são respeitadas por todos os programas. Alguns usam um só -para isso, e outros não aceitam nada para esse fim. Portanto, ./vale a pena ter em mente o anexo .
dmckee
@dmckee está certo; --como argumento especial é uma extensão GNU, mas é mencionado nas diretrizes POSIX. consulte a seção 12.2, diretriz 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... isso significa que você pode esperar que a maioria dos utilitários POSIX e GNU respeite a convenção, mas outros não.
quack quixote
6

Outra técnica é incluir o diretório pai com o nome do arquivo ...

Para renomear o arquivo '-arquivo-para-renomear' para 'arquivo-para-renomear' ...

mv  ../parent-dir/-file-to-rename  file-to-rename

Obrigado @ Skippy le Grand Gourou. Confirmou que ./-file-to-rename funciona com mve rmcomo em ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename
DocSalvager
fonte
1
Ou melhor, como já mencionado nos comentários para charlatanizar a resposta de Quixote, usando ./.
Skippy le Grand Gourou