2012-03-23 13 views
12

Zauważyłem wiele plików w moim katalogu, zwanych "sedAbCdEf" lub podobnych.Dlaczego sed pozostawia wiele plików?

  • Dlaczego tworzy te pliki?
  • Czy mają one jakąś wartość po uruchomieniu skryptu?
  • Czy mogę wysłać te pliki do innej lokalizacji, np. /tmp/?

Aktualizacja:

Sprawdziłem skrypty aż znalazłem jeden, który sprawia, że ​​pliki. Oto przykładowy kod:

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

dlaczego myślisz, że jest to związane z sed? z wyjątkiem nazwy pliku oczywiście, – cctan

+0

Przypuszczam, że może to być wykonane przez coś innego, jednak znajduję je po uruchomieniu skryptów BASH, a skrypty BASH zawierają 'sed'. Wszystkie nazwy plików zaczynają się od "sed", po którym następuje kilka losowych liter. – Village

+1

Czy możesz opublikować skrypt bash? Szukam części, która mówi "blabla> sedAbCdEf"? – cctan

Odpowiedz

11
  • Dlaczego tworzyć te pliki?

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

opcja -i sprawia sed zapisuje wyjście stdout do pliku tymczasowego.
Po wykonaniu sed zmieni nazwę tego pliku tymczasowego, zastępując oryginalny file3.txt.
Jeśli coś jest nie tak po uruchomieniu sed, te pliki tymczasowe sedAbCdE zostaną tam pozostawione.

  • Czy mają one jakąś wartość po uruchomieniu skryptu?

Twój stary plik jest nietknięty. Zwykle nie.

  • Czy mogę wysłać te pliki do innej lokalizacji, np./tmp /?

Tak, możesz to zobaczyć wyżej.

Edytuj: patrz this w celu dalszego przeczytania.

+0

[Kod źródłowy GNU sed-4.2] (http://stackoverflow.com/a/9834294/4279) jak rozumiem, że niemożliwe jest wysłanie tych plików do innej lokalizacji – jfs

+0

@JFSebastian Myślę, że Village oznaczało po tym wszystkim skrypt przestał działać, może potwierdzić OP? – cctan

1

Może to być, że ponieważ użyłeś zbyt dużo sed działania, aw zapętlonego wzór, sed może być co pliki tmp, które nie zostały prawidłowo usunięte.

Sed creates un-deleteable files in Windows

Spójrz na to stanowisko, sed mieć taki problem należy zgłosić wcześniej. Lepszym sposobem jest utworzenie skryptu usuwającego pliki lub utworzenie funkcji usuwającej wszystkie pliki usuwające wszystkie pliki o nazwie zaczynającej się od sed, (^ sed *).

5

Jeśli użyjesz opcji -i (to znaczy dokonasz zmian w miejscu) sed zapisuje do pliku tymczasowego, a następnie zmienia jego nazwę na plik. Dlatego jeśli operacja zostanie przerwana, twój plik pozostanie niezmieniony.

Możesz zobaczyć, które pliki są otwarte, przemianowany z strace:

$ strace -e open,rename sed -i 's/a/b/g' somefile 

Uwaga: somefile otwiera się jako tylko do odczytu.

Wygląda na to, że nie można zastąpić katalogu kopii zapasowej. GNU sed zawsze zapisuje w katalogu plików (± dowiązania symboliczne). Od 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, "."); 

Prefiks sed jest sztywno:

output_file.fp = ck_mkstemp (&input->out_file_name, tmpdir, "sed"); 
+0

Plik tymczasowy musi być utworzony w tym samym katalogu, co plik, który on ' W końcu będę przemianowany, bo inaczej nie będziesz mieć pewności, że zmiana nazwy zadziała. 'sed' powinien usuwać swoje pliki tymczasowe, jeśli nie używa ich do zastąpienia starych plików. – zwol