如何使用Find - exec和Tr处理大量文件

Max*_*ong 5 bash exec find tr

我在bash中遇到find和exec有点麻烦:

假设我有一堆文件,我需要替换'\ 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'
Run Code Online (Sandbox Code Playgroud)

它好像tr在解释';' 作为一个论点,而-exec不是承认它.有没有办法改变这个?我也在目录中创建{}作为文件,而不是用{}代替文件名.

我也尝试过:

find . -exec cat {} | tr -d "\r" > "new_{}"; \;
Run Code Online (Sandbox Code Playgroud)

但是"new_{}"没有变成"new_filename",bash只是从字面上理解并创建一个名为的文件"new{}".

谢谢!

dev*_*ull 6

如果要重定向使用的命令的输出-exec,则需要执行shell命令.此外,您需要将输出重定向到新文件并将其移回原始文件名.

说:

find . -type f -exec sh -c 'tr -d "\r" < "{}" > "{}".new && mv "{}".new "{}"' -- {} \;
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用sed:

find . -type f -exec sed -i 's/\r//' {} \;
Run Code Online (Sandbox Code Playgroud)

或者dos2unix(正如kojiro所指出的):

find . -type f -exec dos2unix {} \;
Run Code Online (Sandbox Code Playgroud)