2012-03-23 28 views
12

Tôi nhận thấy nhiều tệp trong thư mục của tôi, được gọi là "sedAbCdEf" hoặc như vậy.Tại sao sed để lại nhiều tệp tin xung quanh?

  • Tại sao tạo tệp này?
  • Chúng có bất kỳ giá trị nào sau khi tập lệnh chạy không?
  • Tôi có thể gửi các tệp này đến một vị trí khác không, ví dụ: /tmp/?

Cập nhật:

Tôi đã kiểm tra các kịch bản cho đến khi tôi tìm thấy một trong đó làm cho các tập tin. Dưới đây là một số mẫu mã:

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

tại sao bạn cho rằng nó liên quan đến sed? ngoại trừ tên tập tin tất nhiên, – cctan

+0

Tôi cho rằng nó có thể được tạo bởi một thứ khác, tuy nhiên, tôi tìm thấy chúng sau khi chạy các tập lệnh BASH và các tập lệnh BASH chứa 'sed'. Tất cả các tên tập tin bắt đầu bằng "sed", theo sau là một số chữ cái ngẫu nhiên. – Village

+1

bạn có thể đăng tập lệnh bash không? Tôi đang tìm một phần có nội dung 'blabla> sedAbCdEf'? – cctan

Trả lời

11
  • Tại sao nó lại tạo ra những tập tin này?

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

tùy chọn -i làm sed cửa hàng đầu ra stdout vào một tập tin tạm thời.
Sau khi sed được thực hiện, nó sẽ đổi tên tệp tạm thời này để thay thế file3.txt gốc ban đầu của bạn.
Nếu có điều gì đó sai khi sed đang chạy, các tệp tạm thời sedAbCdE này sẽ được giữ lại ở đó.

  • Chúng có giá trị gì sau khi tập lệnh chạy không?

Tệp cũ của bạn không bị ảnh hưởng. Thường thì không.

  • Tôi có thể gửi các tệp này đến một vị trí khác không, ví dụ:/tmp /?

Có thể, xem ở trên.

Chỉnh sửa: xem this để đọc thêm.

+0

[Mã nguồn cho GNU sed-4.2] (http://stackoverflow.com/a/9834294/4279) khi tôi hiểu nó nói rằng không thể gửi các tệp này đến một vị trí khác – jfs

+0

@JFSebastian Tôi nghĩ Village có nghĩa là sau khi tất cả các kịch bản đã ngừng chạy, có thể xác nhận OP? – cctan

1

này có thể là, kể từ khi bạn đã sử dụng những hành động quá nhiều sed, và trong một mô hình lặp, sed chưa làm file tmp mà không được loại bỏ đúng cách.

Sed creates un-deleteable files in Windows

Hãy xem bài này, sed có một vấn đề như vậy được báo cáo trước đó. Cách tốt hơn là tạo một kịch bản để loại bỏ các tệp, hoặc tạo ra một hàm xóa tất cả các tệp xóa tất cả các tệp có tên bắt đầu bằng sed, (^ sed *) giống như điều.

5

Nếu bạn sử dụng tùy chọn -i (có nghĩa là thực hiện thay đổi tại chỗ) sed ghi vào tệp tạm thời và sau đó đổi tên tệp thành tệp của bạn. Vì vậy, nếu hoạt động bị hủy bỏ, tập tin của bạn không thay đổi.

Bạn có thể xem những file được mở, đổi tên với strace:

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

Lưu ý: somefile được mở như chỉ đọc.

Dường như không có cách nào để ghi đè thư mục sao lưu. GNU sed luôn viết trong thư mục của tập tin (± symlinks). Từ 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, "."); 

Prefix sed là hardcoded:

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

Tệp tạm thời phải được tạo trong cùng thư mục với tệp đó ' cuối cùng sẽ được đổi tên thành, nếu không bạn không thể chắc chắn việc đổi tên sẽ hoạt động. "sed' nên được xóa các tập tin tạm thời của nó nếu nó không sử dụng chúng để thay thế các tập tin cũ, mặc dù. – zwol

Các vấn đề liên quan