Как использовать Find - exec и Tr для обработки большого количества файлов

У меня небольшие проблемы с find и exec в bash:

Предположим, у меня есть куча файлов, в которых нужно заменить символы '\r'. (Предыдущий вопрос: объединение столбцов в командной строке с помощью вставки или PR не работает) Для каждого файла я хочу прочитать его и заменить все символы '\r', а затем запишите его обратно в то же имя файла:

Я использую команду find . -exec cat {} | tr -d "\r" > {} \;, но я получаю две ошибки:

tr: extra operand `;'
Only one string may be given when deleting without squeezing repeats.
Try `tr --help' for more information.
find: missing argument to `-exec'

это похоже на tr интерпретирует ';' быть аргументом, а -exec не признает это. Есть ли способ изменить это? Я также создаю {} как файл в каталоге, вместо того, чтобы подставлять {} вместо имени файла.

Я также попробовал:

find . -exec cat {} | tr -d "\r" > "new_{}"; \;

но "new_{}" не превращается в "new_filename", bash просто принимает это буквально и создает файл с именем "new{}",

Спасибо!

1 ответ

Решение

Если вы хотите перенаправить вывод команды, используемой с -exec, вам нужно выполнить команду оболочки. Более того, вам нужно перенаправить вывод в новый файл и переместить его обратно в исходное имя файла.

Сказать:

find . -type f -exec sh -c 'tr -d "\r" < "{}" > "{}".new && mv "{}".new "{}"' -- {} \;

Альтернативой будет использовать sed:

find . -type f -exec sed -i 's/\r//' {} \;

или же dos2unix (как указано kojiro):

find . -type f -exec dos2unix {} \;
Другие вопросы по тегам