Usuń znaki nowej linii w nazwach plików

9

Mam kod PHP, który generuje nazwę pliku, do którego wget doda swoje logi. Wygenerowałem ponad 2000 plików, ale problem polega na tym, że mam z nimi problem, ponieważ pomyliłem się, wpisując PHP_EOLjako część jego nazwy, kod ten doda LF/line feed/%0Anazwę

Przykład takiej nazwy pliku (przy dostępie przez przeglądarkę, po umieszczeniu na / var / www / html) http://xxxx/wget_01_a%0a.txtzwróć uwagę %0ana nazwę przed rozszerzeniem

Pomyliłem się i chciałbym, aby była partia zmiany nazwy, która przeszuka wszystkie pliki, a jeśli ją znajdzie line feed, zmieniłaby nazwę bez wiersza, więc po prostu byłabyhttp://xxxx/wget_01_a.txt

Nie jestem do końca pewien, jak sobie z tym poradzić, ponieważ wydaje się, że kiedy lsna kitach pojawia się cała postać specjalna, która nie ogranicza się tylko do niechcianego char, staje się ?tym, co chcę tylko celować, to linijka.

arvil
źródło

Odpowiedzi:

12

Korzystanie z narzędzia renamez Ut-Linux, które zapewnia CentOS 6, i zakładanie bash:

rename $'\n' '' wget_*

Prosi to o usunięcie znaków nowego wiersza z nazw plików na liście. Polecam wypróbowanie go na małym podzbiorze, aby upewnić się, że robi to, co chcesz (zauważ, że renamew CentOS 7 obsługuje -vprzełącznik pokazujący, jakie zmiany wprowadza).

Jeśli zamiast tego byłeś w dystrybucji, która zapewnia Perla rename:

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

A następnie uruchom bez, -naby faktycznie zmienić nazwę.

dhag
źródło
stary, nic się nie stało pastebin.com/NjMg8vTL Używam centos 6
arvil
Może tak naprawdę nie jest tak naprawdę znak linii \n? Czy możesz zrobić coś takiego jak echo *.txt | od -c, abyśmy mogli zobaczyć, jaki jest rzeczywisty znak, który nie może być wydrukowany?
dhag
wygląda na \n pastebin.com/wXCDCJjr
arvil
Nie jestem pewien, co jest nie tak, chyba że z jakiegoś powodu plik z poprzedniej pasty nie pasuje *.txt(co wyjaśnia, dlaczego renamego nie pobiera). Jeśli ustawisz dwa wzorce na, powiedzmy, txtzamiast $'\n'i '', czy uzyskasz jakieś wyniki? Czy echo $ '\ n' rzeczywiście drukuje dwie nowe linie?
dhag
1
Musiałem użyć, rename $'\r' '' wget_*aby to zadziałało
rshdev
2

Opierając się na tym, na co już udzielono odpowiedzi, uogólniłem go, aby zmienić nazwę wszystkich plików zawierających wiersz polecenia w bieżącym folderze i podfolderze, łącząc polecenie find ze zmianą nazwy -

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

Tutaj polecenie find lokalizuje wszystkie pliki zawierające przesunięcie wiersza, a polecenie zmiany nazwy zastępuje każde przesunięcie wiersza w nazwie spacją.

To samo można zrobić dla wszelkich innych takich problematycznych znaków, takich jak powrót karetki (\ r).

Prasad Bhat
źródło