Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用Find-exec和Tr处理大量文件_Bash_Find_Exec_Tr - Fatal编程技术网

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

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

我在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 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 {} \;