Удалить переводы строк в именах файлов

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намазываю все специальные символы, не ограниченные этим нежелательным символом, становится ?, то, что я только хочу нацелиться, - это перевод строки.

arvil
источник

Ответы:

12

Используя утилиту renameиз util-linux, которую предоставляет CentOS 6, и принимая bash:

rename $'\n' '' wget_*

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

Если вместо этого вы были в дистрибутиве, который предоставляет на основе Perl rename:

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

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

dhag
источник
братан, ничего не произошло 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 находит все файлы, содержащие перевод строки, а команда rename заменяет каждый перевод строки в имени пробелом.

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

Прасад Бхат
источник