Remover novas linhas nos nomes de arquivo


9

Eu tenho um código PHP que gera o nome do arquivo no qual o wget anexará seus logs. Gerei mais de 2000 arquivos, mas o problema é que estou tendo problemas para trabalhar com eles, porque tive um erro ao colocar PHP_EOLcomo parte do nome, esse código será adicionado LF/line feed/%0Aao nome

Exemplo desse nome de arquivo (quando acessado via navegador, quando colocado em / var / www / html), http://xxxx/wget_01_a%0a.txtobserve o %0aantes do nome da extensão

Eu errei, e eu gostaria que houvesse um lote de renomeação que pesquisasse todos os arquivos e, se encontrado line feed, o renomeará sem o feed de linha, para que apenashttp://xxxx/wget_01_a.txt

Não tenho muita certeza de como lidar com isso, porque parece que quando lscoloco em massa todos os caracteres especiais não limitados a esse caractere indesejado ?, o que eu só desejo atingir é o feed de linha.

Respostas:


11

Usando o utilitário renameutil-linux, fornecido pelo CentOS 6, e assumindo o bash:

rename $'\n' '' wget_*

Isso pede para excluir caracteres de nova linha dos nomes dos arquivos listados. Eu recomendo experimentá-lo em um pequeno subconjunto para garantir que ele faça o que você deseja (observe que renameno CentOS 7 é compatível com um -vswitch para mostrar quais alterações ele está fazendo).

Se você estivesse em uma distribuição que fornece o baseado em Perl rename:

rename -n 's/\n//g' wget_*

E, em seguida, execute sem -nexecutar realmente a renomeação.


bro, nada aconteceu pastebin.com/NjMg8vTL Estou usando centos 6
arvil

Talvez o caractere de avanço de linha que você possui não seja realmente \n? Você pode fazer algo como eco, *.txt | od -cpara que possamos ver qual caractere não imprimível real existe?
dhag


Não tenho certeza do que está errado, a menos que, por algum motivo, o arquivo em sua pasta anterior não corresponda *.txt(o que explicaria o motivo de renamenão buscá-lo). Se você definir os dois padrões para, digamos, em txtvez de $'\n'e '', obtém alguma saída? O eco $ '\ n' realmente imprime duas novas linhas?
dhag

1
Eu tive que usar rename $'\r' '' wget_*para que ele funcione
rshdev

2

Com base no que já foi respondido, eu o generalizei para renomear todos os arquivos que contêm feed de linha na pasta e subpasta atual, combinando o comando find com rename -

find -name $'*\n*' -exec rename  $'s|\n| |g' '{}' \;

Aqui, o comando find localiza todos os arquivos que contêm avanço de linha e o comando renomear substitui cada avanço de linha no nome por um espaço.

O mesmo pode ser feito para outros caracteres problemáticos, como retorno de carro (\ r).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.