Почему sed оставляет много файлов? - PullRequest
12 голосов
/ 23 марта 2012

Я заметил много файлов в моем каталоге, называемых "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

Ответы [ 3 ]

11 голосов
/ 23 марта 2012
  • Почему он создает эти файлы?

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

опция -i заставляет sed сохранять вывод stdout во временный файл.
После завершения sed он переименует этовременный файл для замены вашего исходного file3.txt.
Если что-то не так во время работы sed, эти временные файлы sedAbCdE останутся там.

  • Имеют ли они какое-либо значение после запуска скрипта?

Ваш старый файл не тронут.Обычно нет.

  • Могу ли я отправить эти файлы в другое место, например / tmp /?

Да, можно, см. Выше.

Редактироватьсм. это для дальнейшего чтения.

5 голосов
/ 23 марта 2012

Если вы используете опцию -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");
1 голос
/ 23 марта 2012

Это может быть связано с тем, что вы использовали слишком много действий sed и в зацикленном паттерне sed может создавать файлы tmp, которые не удаляются должным образом.

Sed создает не удаляемые файлы в Windows

Посмотрите на этот пост, у sed есть такая проблема, о которой сообщалось ранее.Лучший способ - создать сценарий, который удаляет файлы, или создать функцию, которая удаляет все файлы, удаляет все файлы с именами, начинающимися с sed, (^ sed *), как вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...