循环 tr 命令删除目录中多个文件中的“\r”

循环 tr 命令删除目录中多个文件中的“\r”

我目录中有大约 260 个文件。我如何将这些文件逐个输入到类似这样的
file数组名称中

file=多个文件的输入流
x=0

环形
tr -d '\r' 文件2
rm $文件
mv 文件2 $文件
x=$x+1
循环结束

答案1

使用find单行代码:

find . -maxdepth 1 -type f -exec sh -c '< "{}" tr -d "\r" > "{}.processed"' \;

这将在当前工作目录中为每个文件创建一个去掉回车符的副本,并以原始文件的名称加上扩展名.processed

tr只能从 读取stdin,因此它无法本地编辑文件,但是有一种技巧是将文件的内容重定向到子shell的 ,并将其stdin作为此处的字符串重定向到,以便在发生写入文件所需的截断之前读取该文件:trstdin

find . -maxdepth 1 -type f -exec bash -c '<<< "$(< {})" tr -d "\r" > {}' \;

答案2

使用perl

perl -i -pe 'tr/\r//d' <your_file>

并对find文件夹中的所有文件执行以下代码:

  • 长版本

    find <your_path> -maxdepth 1 -type f -print0 | xargs -I{} -0 perl -i -pe 'tr/\r//d' {}
    
  • 简洁版本

    find <your_path> -maxdepth 1 -type f -exec perl -i -pe 'tr/\r//d' {} \;
    

例子

$ printf "%s\n%s\n" "line 1" "line 2" > foo
$ printf "%s\r\n%s\n" "line 1" "line 2" > bar

$ hexdump foo
0000000 696c 656e 3120 6c0a 6e69 2065 0a32     
000000e

$ hexdump bar
0000000 696c 656e 3120 0a0d 696c 656e 3220 000a
000000f

$ perl -i -pe 'tr/\r//d' bar

$ hexdump bar
0000000 696c 656e 3120 6c0a 6e69 2065 0a32     
000000e

相关内容