Почему 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
Ответы
Ответ 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 *).