Функция do strings $L | tr '[\s]' '[\n'] > $L затирает файл

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

uzak
Сообщения: 14

Функция do strings $L | tr '[\s]' '[\n'] > $L затирает файл

Сообщение uzak » 06.07.2014 12:15

Нужно удалить все непечатные символы в файлах. Для удобочитаемости пытаюсь также разбить текст на строки.

Код: Выделить всё

find . -type f | while read L; do strings $L | tr '[\s]' '[\n'] > $L; done

find . -type f | while read L; do XR=`strings $L`; echo $XR | tr '[\s]' '[\n'] > $L; done



Пробовал разные варианты, ни один корректно у меня не заработал, либо затирает файлы, либо вообще непонятно. Хотя с одним файлом на входе:

Код: Выделить всё

 strings file | tr '[\s]' '[\n'] > file


все работает.
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Функция do strings $L | tr '[\s]' '[\n'] > $L затирает файл

Сообщение SLEDopit » 06.07.2014 14:59

Так понятное дело затирает. Вы ж перенаправляете в тот же файл, что и читаете. Оно так не работает.
Дело в том, что обычно bash сначала открывает перенаправление (перезаписывает файл), а потом начинает читать файл. Т.е. файл сначала затирается, а потом читается уже пустой.
Используйте временный файл.

uzak писал(а):
06.07.2014 12:15
strings file | tr '[\s]' '[\n'] > file
а это работает, потому что у вас скорее всего файл очень маленький. пара-тройка строк. в таком случае оно иногда отрабатывает.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

uzak
Сообщения: 14

Re: Функция do strings $L | tr '[\s]' '[\n'] > $L затирает файл

Сообщение uzak » 07.07.2014 05:57

SLEDopit писал(а):
06.07.2014 14:59
Так понятное дело затирает. Вы ж перенаправляете в тот же файл, что и читаете. Оно так не работает.
Дело в том, что обычно bash сначала открывает перенаправление (перезаписывает файл), а потом начинает читать файл. Т.е. файл сначала затирается, а потом читается уже пустой.
Используйте временный файл.

uzak писал(а):
06.07.2014 12:15
strings file | tr '[\s]' '[\n'] > file
а это работает, потому что у вас скорее всего файл очень маленький. пара-тройка строк. в таком случае оно иногда отрабатывает.


Оказалось проблема из-за большого количества файлов.

Подскажите как можно раскидать файлы по папкм? Вот нашел перловский скрипт, но там файлы переименовываются, мне нужно сохранить названия. Подправьте кто знаком с перлом, буду оч признателен.

Код: Выделить всё

$i++%50||++$j&mkdir($f="folder$j")&($i=1),rename$_,"$f/$i"for<*>
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Функция do strings $L | tr '[\s]' '[\n'] > $L затирает файл

Сообщение Bizdelnick » 07.07.2014 08:03

Вот это путь к файлу:
uzak писал(а):
07.07.2014 05:57

Замените на
Хотя не понимаю, что у Вас за трабла, из-за которой такое требуется.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: