2009-12-01 22 views
16

Tôi đang cố gắng chạy lệnh sau trong Windows Server 2003 nhưng sed tạo một đống tệp mà tôi không thể xóa khỏi dòng lệnh bên trong thư mục hiện tại.Sed tạo các tệp không thể xóa trong Windows

for /R %f in (*.*) do "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g" "%f"

Có ai có đề xuất nào không? Rất bí ẩn, tôi có thể xóa các tệp bằng Windows Explorer.

Theo yêu cầu, đây là một số tên tập tin ví dụ:

  • sed0E3WZJ
  • sed5miXwt
  • sed6fzFKh

Và, thông tin khắc phục sự cố ...

  • Nó xảy ra từ cả dấu nhắc lệnh & batch file
  • Nếu tôi chỉ cần chạy sed trên một thư mục duy nhất, sau đó tôi sử dụng sed "s/bad/good/g" *.* và mọi thứ đều OK. Than ôi, tôi cũng cần nó để giải quyết tất cả các thư mục con.
  • Tôi chỉ cài đặt Sed.
  • Sed đang tạo ra các tập tin
+0

Nó sẽ giúp đỡ nếu bạn thấy một ví dụ tên tập tin. Tôi đã thử lệnh của bạn với "c: \ cygwin \ bin \ sed.exe" và nó hoạt động tốt hơn là cảnh báo về dấu gạch chéo ngược so với dấu gạch chéo. –

+0

sed -i thực sự hoạt động khá tốt đối với tôi nếu tệp không chỉ đọc để bắt đầu. Không còn các tệp tạm thời không thể xóa được và không có lỗi. Tôi nên đề cập đến tôi đang sử dụng nó kết hợp với tìm thay vì trong một vòng lặp for. – mjohnsonengr

Trả lời

17

Tôi đã sao chép thiết lập của bạn và tôi có các quan sát sau đây.

  1. Tôi không nghĩ rằng có sự cố trong vòng lặp. Lệnh đơn giản "C: \ Program Files \ gnuwin32 \ bin \ sed.exe" -i "s/bad/good/g" . - tạo cùng một tập hợp các tệp tạm thời.
  2. Các tệp này thực sự được tạo bởi sed. sed tạo ra các tệp tạm thời này khi tùy chọn "tại chỗ" (-i) được bật. Trong khóa học bình thường, sed thực sự xóa các tập tin (đó là những gì xảy ra trong Cygwin) bằng cách sử dụng một cuộc gọi đến thư viện 'unlink'. Trong trường hợp của gnuwin32, có vẻ như 'hủy liên kết' không thành công. Tôi đã không thể tìm ra lý do tại sao. Tôi đã đoán rằng có thể cuộc gọi unlink phụ thuộc vào thư viện 'gutwin32' coreutils 'và cố gắng tải xuống và cài đặt thư viện coreutils - không có xúc xắc.
  3. Nếu bạn loại bỏ hạn chế 'chỉ đọc' trong thư mục mẹ trước khi thực hiện lệnh sed, bạn có thể xóa các tệp tạm thời khỏi dấu nhắc lệnh của cửa sổ. Vì vậy, điều đó sẽ cho bạn một số thời gian nghỉ ngơi tạm thời.

Tôi nghĩ giờ đây chúng tôi có đủ thông tin để nâng cao báo cáo lỗi. Nếu bạn đồng ý, tôi nghĩ rằng nó có thể là một ý tưởng tốt để đưa nó vào thông báo của những người tốt chịu trách nhiệm về gnuwin32 và yêu cầu họ giúp đỡ.

Trong khi đó, phiên bản sau dọn dẹp tập tin tạm thời của nó:

+4

Đó là một lỗi đã biết (http://sourceforge.net/projects/gnuwin32/forums/forum/74807/topic/845128). Tôi đã gửi báo cáo lỗi nhưng tôi không hy vọng (https://sourceforge.net/tracker/?func=detail&aid=2931036&group_id=23617&atid=379173). –

+0

6 năm và đếm ... –

0

bạn chỉ có thể chạy mà không cần sed vòng lặp for

c:\test> sed -i.bak "s/bad/good/g" file*.* 
+0

Chỉ cần cố gắng (trừ "tệp") trong thư mục có tên "Kiểm tra" với thư mục con có tên "Thư mục Mới" và tôi nhận được lỗi sau: C: \ Documents and Settings \ zchoy \ Desktop \ Test> "C: \ Program Files \ gnuwin32 \ bin \ sed.exe "-i.bak" s/bad/good/g "*. * sed.exe: không thể đọc Thư mục mới: Quyền bị từ chối Tôi cũng có tệp rác : sed3aQhvO –

1

Cygwin ống ACL trên các tập tin đôi khi, có thể bạn sẽ phải sử dụng cacls hoặc chmod để sửa chữa nó trước khi bạn có thể xóa tệp.

+0

Thật không may, tôi không cài đặt Cygwin. –

+1

@Zian cacls là ứng dụng Windows tích hợp, như xcacls ('cacls' mới). Ngoài ra, tôi nên đã đề cập rằng sed của GnuWin32 rất có thể cũng có vấn đề này –

1

Đây là nơi một chút khắc phục sự cố xảy ra. Điều này có xảy ra khi bạn chạy lệnh đó từ dòng lệnh một tệp lô không? Điều gì xảy ra nếu bạn chạy sed trên một tệp riêng lẻ trên dòng lệnh - nó có tạo ra các tệp này cho mỗi tệp hay chỉ một số tệp/tệp nhất định không? Liệu nó chỉ xảy ra cho thay thế đó, hoặc tất cả thay thế nói chung, hoặc chỉ luôn luôn khi bạn chạy sed.exe trên một tập tin? Nó chỉ là sed tạo ra những tập tin này, hoặc tất cả exe của Gnuwin32 (ví dụ như awk, mèo, vv)? Liệu điều tương tự xảy ra trên một sed.exe từ một cài đặt mới của Gnuwin32? Thông báo lỗi nào được cung cấp khi bạn cố xóa các tệp? Bạn có thể xóa các tập tin từ thám hiểm trong khi dấu nhắc lệnh vẫn mở? Điều gì sẽ xảy ra nếu bạn đóng dấu nhắc lệnh và mở lại nó, sau đó thử xóa các tập tin?

0

Đây là một đâm trong bóng tối, nhưng nó sẽ không ngạc nhiên tôi trong ít nhất nếu việc thực hiện gnuwin32 của sed là duff (tức là, bị lỗi theo một cách nào đó). Bạn có thể thử sao chép sự cố bằng cách sử dụng hỗ trợ POSIX AT&T U/Win cho cửa sổ không? Nó rất dễ cài đặt và bao gồm vỏ Korn, sedfind, vì vậy bạn có thể sử dụng find thay vì FOR /R. (Tôi tự hỏi nếu một phần của vấn đề là MS FOR và gnuwin32 sed không chơi độc đáo với nhau.)

3

Vì đây là một lỗi được biết đến trong sed với tùy chọn -i bạn có thể chạy attrib -R <filename> để loại bỏ các chỉ đọc thuộc tính từ tệp sau khi sed hoàn thành.

Hoặc không sử dụng tùy chọn -i và chuyển hướng đầu ra sang tệp mới, sau đó xóa và đổi tên đầu vào và đầu ra.

+0

Hoặc chạy attrib -R trước khi chạy "sed -i" – mjohnsonengr

0

Tôi nhận thấy đây là một chuỗi cũ nhưng vẫn là vấn đề. Sửa lỗi của tôi là thêm "DEL sed *" vào cuối tệp hàng loạt sau sed. Nhanh chóng và hèn hạ.

+0

Tôi nghĩ về điều đó, thật không may, ban nhạc này viện trợ sẽ không làm việc cho tôi vì hai lý do: 1. Tôi có tệp trong dự án của tôi có tên bắt đầu bằng sed. 2. Bất kỳ nhà phát triển nào làm việc trong dự án của tôi đều có thể thêm các tệp bổ sung có tên bắt đầu bằng sed. –

0

Tôi đang sử dụng lệnh này để dọn dẹp các tập tin tạm thời được tạo ra bởi gnuwin32's sed:

FOR /f "tokens=*" %%a in ('dir /b ^| findstr /i "^sed[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]$"') DO del %%a 
Các vấn đề liên quan