【问题标题】:Why does sed leave many files around?为什么 sed 会留下很多文件?
【发布时间】:2012-04-07 16:15:50
【问题描述】:

我注意到我的目录中有许多文件,称为“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

【问题讨论】:

  • 为什么你认为它与sed有关?当然,除了文件名,
  • 我想它可以由其他东西制作,但是,我在运行 BASH 脚本后发现它们并且 BASH 脚本包含sed。所有文件名都以“sed”开头,后跟一些随机字母。
  • 你能发布 bash 脚本吗?我正在寻找一个写着blabla &gt; sedAbCdEf的部分?
  • @NiklasB.: sed -i 创建文件,见my answer

标签: linux sed


【解决方案1】:

如果您使用-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 应该删除它的临时文件,如果它不使用它们来替换旧文件。
【解决方案2】:
  • 为什么要创建这些文件?

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

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

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

您的旧文件未受影响。通常不会。

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

是的,你可以,见上文。

编辑:请参阅this 以进一步阅读。

【讨论】:

  • The source code for GNU sed-4.2 据我了解,无法将这些文件发送到其他位置
  • @J.F.Sebastian 我认为 Village 的意思是在所有脚本停止运行后,可以确认 OP 吗?
【解决方案3】:

这可能是因为您使用了过多的 sed 操作,并且在循环模式中,sed 可能会生成未正确删除的 tmp 文件。

Sed creates un-deleteable files in Windows

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2015-01-01
    • 2017-05-30
    • 2013-03-15
    相关资源
    最近更新 更多