Rimuovi le nuove righe nei nomi dei file


9

Ho un codice PHP che genera il nome del file su cui wget aggiungerà i suoi registri. Ho generato oltre 2000 file, ma il problema è che ho problemi a lavorare con loro perché ho avuto un errore nel mettere PHP_EOLcome parte del suo nome, quel codice aggiungerà LF/line feed/%0Aal suo nome

Esempio di tale nome di file (quando si accede tramite browser, quando si inserisce / var / www / html) http://xxxx/wget_01_a%0a.txtnotare %0aprima del nome dell'estensione

Ho sbagliato e vorrei che ci fosse un batch di rinomina che cercherà tra tutti i file e se lo trovasse line feedlo rinominerebbe senza il feed di linea, quindi sarebbe solohttp://xxxx/wget_01_a.txt

Non sono abbastanza sicuro di come gestirlo perché sembra che quando lsin putty tutto il carattere speciale non limitato a quel carattere indesiderato diventa ?, quello che desidero solo prendere di mira è quel feed di riga.

Risposte:


11

Utilizzando l'utilità renamedi util-linux, fornita da CentOS 6, e assumendo bash:

rename $'\n' '' wget_*

Ciò richiede di eliminare i caratteri di nuova riga dai nomi dei file elencati. Ti consiglio di provarlo su un piccolo sottoinsieme per assicurarti che faccia quello che vuoi (nota che renamesu CentOS 7 supporta uno -vswitch per mostrarti quali cambiamenti sta apportando).

Se invece fossi su una distribuzione che fornisce il Perl rename:

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

E quindi esegui senza -neseguire effettivamente la ridenominazione.


fratello, non è successo niente pastebin.com/NjMg8vTL Sto usando centos 6
incudine

Forse il personaggio del linefeed che hai non è in realtà \n? Puoi fare qualcosa come l'eco in *.txt | od -cmodo da vedere quale personaggio reale non stampabile c'è?
Dhag,


Non sono sicuro di cosa c'è che non va, a meno che per qualche motivo il file nel tuo incolla precedente non corrisponda *.txt(il che spiegherebbe perché renamenon lo prende). Se impostate i due pattern su, diciamo, txtinvece di $'\n'e '', ottenete qualche output? Echo $ '\ n' stampa davvero due nuove righe?
Dhag,

1
Ho dovuto usarlo rename $'\r' '' wget_*perché funzionasse
rshdev il

2

Sulla base di ciò che è già stato risposto, l'ho generalizzato per rinominare tutti i file contenenti feed di riga nella cartella e sottocartella corrente, combinando il comando find con rename -

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

Qui, il comando find individua tutti i file contenenti feed di riga e il comando rename sostituisce ogni feed di riga nel nome con uno spazio.

Lo stesso può essere fatto per qualsiasi altro carattere problematico come il ritorno a capo (\ r).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.