Подтвердить что ты не робот

Почему sed оставляет много файлов?

Я заметил много файлов в моем каталоге, называемых "sedAbCdEf" или таких.

  • Почему он создает эти файлы?
  • У них есть какое-либо значение после запуска script?
  • Можно ли отправить эти файлы в другое место, например. /tmp/?

Update:

Я проверил скрипты, пока не нашел файл, который создает файлы. Вот пример кода:

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

Ответ 1

  • Почему он создает эти файлы?

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

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

  • У них есть какое-либо значение после запуска script?

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

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

Да, вы можете, см. выше.

Изменить: см. этот для дальнейшего чтения.

Ответ 2

Если вы используете параметр -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");

Ответ 3

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

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

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