Bash 如何使用Find-exec和Tr处理大量文件
我在bash中的find和exec有点问题: 假设我有一堆需要替换中“\r”字符的文件。(上一个问题:)对于每个文件,我要读取它,并替换所有“\r”,然后将其写回相同的文件名: 我使用的命令是Bash 如何使用Find-exec和Tr处理大量文件,bash,find,exec,tr,Bash,Find,Exec,Tr,我在bash中的find和exec有点问题: 假设我有一堆需要替换中“\r”字符的文件。(上一个问题:)对于每个文件,我要读取它,并替换所有“\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
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{}”文件名“
,bash只是按照字面意思创建一个名为“new{}”的文件
谢谢 如果要重定向与-exec
一起使用的命令的输出,则需要执行shell命令。此外,还需要将输出重定向到新文件,并将其移回原始文件名
说:
或dos2unix
(如所指出的):
这似乎是可行的,但在新文件上运行文件时,它仍然显示:ASCII文本,带有CRLF行终止符,因此它似乎没有替换CR@MaxSong第一个选项中的引用稍有错误。现在应该修好了。太好了!两个命令都能完美地工作。谢谢你的回复!可能值得指出的是,dos2unix
将为您执行就地覆盖,大大简化了所需的命令。@kojiro谢谢,添加了该选项。事实上,我是从告诉OP问题开始的,最明显的问题没有发生!
find . -type f -exec sh -c 'tr -d "\r" < "{}" > "{}".new && mv "{}".new "{}"' -- {} \;
find . -type f -exec sed -i 's/\r//' {} \;
find . -type f -exec dos2unix {} \;