Eliminar nuevas líneas en los nombres de archivo

9

Tengo un código PHP que genera el nombre del archivo en el que wget agregará sus registros. Generé más de 2000 archivos, pero el problema es que tengo problemas para trabajar con ellos porque tuve un error al ponerlos PHP_EOLcomo parte de su nombre, ese código se agregará LF/line feed/%0Aa su nombre

Ejemplo de dicho nombre de archivo (cuando se accede a través del navegador, cuando se coloca en / var / www / html) http://xxxx/wget_01_a%0a.txtobserve el %0anombre antes de la extensión

Me equivoqué y desearía que hubiera un lote de cambio de nombre que buscaría en todos los archivos y, si lo encontraba line feed, lo cambiaría sin el avance de línea, por lo que seríahttp://xxxx/wget_01_a.txt

No estoy muy seguro de cómo manejar esto porque parece que cuando uso lsmasilla de caracteres especiales no limitados a ese carácter no deseado ?, lo único que deseo es apuntar a ese salto de línea.

arvil
fuente

Respuestas:

11

Usando la utilidad renamede util-linux, que proporciona CentOS 6, y suponiendo bash:

rename $'\n' '' wget_*

Esto solicita eliminar caracteres de nueva línea de los nombres de los archivos enumerados. Recomiendo probarlo en un pequeño subconjunto para asegurarse de que haga lo que desea (tenga renameen cuenta que en CentOS 7 admite un -vinterruptor para mostrarle los cambios que está realizando).

Si, en cambio, estaba en una distribución que proporciona el basado en Perl rename:

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

Y luego ejecute sin -nrealizar el cambio de nombre.

dhag
fuente
hermano, no pasó nada pastebin.com/NjMg8vTL Estoy usando centos 6
arvil
¿Quizás el personaje de salto de línea que tienes no es realmente \n? ¿Puedes hacer algo como echo *.txt | od -cpara ver qué personaje real no imprimible hay?
dhag
parece \n pastebin.com/wXCDCJjr
arvil
No estoy seguro de lo que está mal, a menos que, por alguna razón, el archivo en su pegado anterior no coincida *.txt(lo que explicaría por qué renameno lo recoge). Si establece los dos patrones en, digamos, en txtlugar de $'\n'y '', ¿obtiene algún resultado? ¿Echo $ '\ n' imprime dos líneas nuevas?
dhag
1
Tuve que usar rename $'\r' '' wget_*para que funcionara
rshdev
2

Sobre la base de lo que ya se respondió, lo generalicé para cambiar el nombre de todos los archivos que contienen salto de línea en la carpeta y subcarpeta actuales, combinando el comando find con rename -

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

Aquí, el comando find localiza todos los archivos que contienen salto de línea y el comando renombrar reemplaza cada salto de línea en el nombre con un espacio.

Lo mismo puede hacerse para cualquier otro personaje problemático como el retorno de carro (\ r).

Prasad Bhat
fuente