Видаліть нові рядки з імен файлів


9

У мене є PHP-код, який генерує ім'я файлу, до якого wget додаватиме свої журнали. Я створив 2000+ файлів, але проблема полягає в тому, що я маю проблеми з роботою з ними, тому що у мене була помилка введення PHP_EOLяк частини його імені, цей код додасть LF/line feed/%0Aу своє ім'я

Приклад такого імені файлу (при доступі через браузер, при введенні / var / www / html) http://xxxx/wget_01_a%0a.txtзверніть увагу на %0aім'я розширення

Я переплутав, і я хочу, щоб була партія перейменування, яка буде шукати всі файли, і якщо вона знайде, line feedвона перейменовує її без стрічки каналу, так що це простоhttp://xxxx/wget_01_a.txt

Я не дуже впевнений, як впоратися з цим, тому що, здається, коли я lsна шпаклівці набуває всіх спеціальних символів, не обмежених тим небажаним знаком ?, те, що я хочу лише націлити, - це стрічка каналів.

Відповіді:


12

Використання утиліти renameвід util-linux, яку надає CentOS 6, та припущення bash:

rename $'\n' '' wget_*

Це вимагає видалити символи нового рядка з імен перелічених файлів. Я рекомендую спробувати його на невеликому підмножині, щоб переконатися, що він робить те, що ви хочете (зауважте, що renameу CentOS 7 підтримується -vкомутатор, щоб показати вам, які зміни він вносить).

Якщо замість цього ви працювали в дистрибутиві, який надає Perl rename:

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

А потім запустіть без -nфактичного виконання перейменування.


брато, нічого не сталося pastebin.com/NjMg8vTL Я використовую centos 6
arvil

Можливо, персонаж, який ви робите, не є насправді \n? Чи можете ви зробити щось на кшталт відлуння, *.txt | od -cщоб ми побачили, який там власне недрукований персонаж?
даг

схоже на \n pastebin.com/wXCDCJjr
arvil

Я не впевнений, що не так, якщо тільки з якихось причин файл у вашій попередній пасті не збігається *.txt(це пояснило б, чому renameйого не забрати). Якщо встановити два шаблони, скажімо, txtзамість $'\n'і '', чи отримуєте ви якийсь результат? Чи справді надрукує два нових рядки echo $ '\ n'?
даг

1
Мені довелося використовувати rename $'\r' '' wget_*для роботи
rshdev

2

Спираючись на вже відповідь, я узагальнив його для перейменування всіх файлів, що містять подачу рядків у поточній папці та підпапці, поєднуючи команду find з перейменуванням -

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

Тут команда find знаходить усі файли, що містять подачу рядків та команда перейменування, замінює кожен канал рядка в імені пробілом.

Те саме можна зробити для будь-яких інших таких проблемних символів, як повернення каретки (\ r).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.