我在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{}".
谢谢!
如果要重定向使用的命令的输出-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)