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

12

我注意到我的目录中有很多名为“sedAbCdEf”的文件或类似的文件。

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

更新:

我检查了脚本,直到找到创建这些文件的脚本。以下是一些示例代码:

#!/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

1
你为什么认为这与sed有关呢?当然,除了文件名。 - cctan
我猜它可能是由其他东西制作的,但是在运行BASH脚本并且BASH脚本包含sed之后,我发现它们。所有的文件名都以“sed”开头,后面跟着一些随机字母。 - Village
1
你能发布Bash脚本吗?我正在寻找一个包含blabla > sedAbCdEf的部分。 - cctan
1
@NiklasB.:sed -i 会创建文件,请参见我的回答 - jfs
3个回答

12
  • 为什么会生成这些文件?

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

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

  • 在脚本运行后,这些文件是否有任何价值?

通常情况下,您的旧文件不受影响,这些文件没有任何价值。

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

是的,可以看上面的说明。

编辑:有关更多信息,请参见此处


据我所知,GNU sed-4.2的源代码(https://dev59.com/0Gkw5IYBdhLWcg3whK48#9834294)表明不可能将这些文件发送到另一个位置。 - jfs
@J.F.Sebastian 我认为Village的意思是在脚本停止运行之后,可以确认OP吗? - cctan

5
如果您使用-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 应该删除其临时文件,如果它们没有用于替换旧文件的话。 - zwol

2

可能是因为您使用了太多的sed操作,并且在循环模式下,sed可能会生成未被正确删除的临时文件。

Sed在Windows中创建无法删除的文件

看一下这篇文章,sed之前已经报告过这样的问题。更好的方法是创建一个脚本来删除文件,或者创建一个函数来删除所有以sed开头的文件(类似于^sed*的东西)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接