Как использовать 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 {} \;