为什么sed会留下许多文件?

我注意到我的目录中有很多文件,叫做“sedAbCdEf”或类似的东西。

  • 为什么会创build这些文件?
  • 脚本运行后,这些脚本是否有价值?
  • 我可以将这些文件发送到另一个位置,例如/tmp/

更新:

我检查了脚本,直到find一个制作文件的脚本。 这是一些示例代码:

 #!/bin/bash a=1 b=`wc -l < ./file1.txt` while [ $a -le $b ]; do for i in `sed -n "$a"p ./file1.txt`; do for j in `sed -n "$a"p ./file2.txt`; do sed -i "s/$i/\nZZ$jZZ\n/g" ./file3.txt c=`grep -c $j file3.txt` if [ "$c" -ge 1 ] then echo $j >> file4.txt echo "Replaced "$i" with "$j" "$c" times ("$a"/"$b")." fi echo $i" not found ("$a"/"$b")." a=`expr $a + 1` done done done 

  • 为什么会创建这些文件?

sed -i "s/$i/\nZZ$jZZ\n/g" ./file3.txt

-i选项使sed将stdout输出存储到临时文件中。
sed完成后,它会重命名这个临时文件来替换原来的file3.txt文件。
如果sed正在运行时出现问题,这些sedAbCdE临时文件将会保留在那里。

  • 脚本运行后,这些脚本是否有价值?

你的旧文件是不变的。 通常没有。

  • 我可以将这些文件发送到另一个位置,例如/ tmp /?

是的,你可以,见上面。

编辑:看到这个进一步阅读。

如果你使用-i选项(这意味着进行更改) sed写入临时文件,然后重命名为您的文件。 因此如果操作被中止,你的文件保持不变。

你可以看到哪些文件被打开,用strace重命名:

 $ strace -e open,rename sed -i 's/a/b/g' somefile 

注意: somefile以只读方式打开。

似乎没有办法覆盖备份目录。 GNU sed总是写入文件的目录(±符号链接)。 从sed / execute.c :

 if (follow_symlinks) input->in_file_name = follow_symlink (name); else input->in_file_name = name; /* get the base name */ tmpdir = ck_strdup(input->in_file_name); if ((p = strrchr(tmpdir, '/'))) *(p + 1) = 0; else strcpy(tmpdir, "."); 

前缀sed是硬编码的:

 output_file.fp = ck_mkstemp (&input->out_file_name, tmpdir, "sed"); 

这可能是因为你已经使用了太多的sed动作,并且在一个循环模式下,sed可能会使得tmp文件无法正确删除。

Sed在Windows中创建不可删除的文件

看看这个帖子,sed有这个问题要报以前。 更好的方法是创建一个删除文件的脚本,或者创建一个删除所有文件的函数,删除名称以sed开头的所有文件(^ sed *)。