2009-12-01 63 views
16

我試圖在Windows Server 2003中運行以下命令,但sed創建了一堆文件,我無法從當前目錄內的命令行中刪除這些文件。Sed在Windows中創建不可刪除的文件

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

有沒有人有什麼建議?神祕的是,我可以使用Windows資源管理器刪除這些文件。

按照要求,這裏有一些例子,文件名:

  • sed0E3WZJ
  • sed5miXwt
  • sed6fzFKh

而且,更多的故障排除信息...

  • 它發生從命令提示符&批處理文件
  • 如果我只需要在單個目錄上運行sed,那麼我使用sed "s/bad/good/g" *.*,並且一切正常。唉,我也需要它來處理所有的子目錄。
  • 我只安裝了Sed。
  • 桑達創造
+0

這將幫助,如果你表現出一個例子文件名。我用「c:\ cygwin \ bin \ sed.exe」試過了你的命令,除了關於反斜槓和斜線的警告外,它工作正常。 – 2009-12-01 07:45:03

+0

如果文件不是隻讀的,sed -i實際上對我來說效果不錯。沒有不可恢復的臨時文件,並且沒有錯誤。我應該提到,我將它與查找結合使用,而不是在for循環中。 – mjohnsonengr 2014-12-05 18:01:47

回答

17

我已經複製了您的設置,我有以下意見。

  1. 我不認爲循環中有問題。簡單命令「C:\ Program Files \ gnuwin32 \ bin \ sed.exe」-i「s/bad/good/g」 - 創建相同的一組臨時文件。
  2. 這些文件確實是由sed創建的。當「in place」(-i)選項打開時,sed會創建這些臨時文件。在正常的過程中,sed實際上通過調用'unlink'庫來刪除文件(這就是cygwin中發生的情況)。在gnuwin32的情況下,它看起來像'取消鏈接'失敗。我一直無法弄清楚爲什麼。我猜測,也許unlink調用依賴於gnuwin32'coreutils'庫,並嘗試下載並安裝coreutils庫 - 沒有骰子。
  3. 如果在執行sed命令之前刪除父文件夾中的「只讀」限制,則可以從Windows命令提示符中刪除臨時文件。所以這應該給你暫時的喘息機會。

我想我們現在有足夠的信息來提出一個錯誤報告。如果您同意,我認爲將它引入負責gnuwin32的好人的通知並請他們尋求幫助可能是個好主意。

同時,以下版本清理其臨時文件:

+4

這是一個已知的bug(http://sourceforge.net/projects/gnuwin32/forums/forum/74807/topic/845128)。我已經提交了一個錯誤報告,但我並不抱有希望(https://sourceforge.net/tracker/?func=detail&aid=2931036&group_id=23617&atid=379173)。 – 2010-01-13 00:02:26

+0

6年和計數... – 2016-04-04 08:31:42

0

您可以只運行不sed的for循環

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

剛剛在一個名爲「Test」的文件夾中用名爲「New Folder」的子目錄試過(減去「文件」),我得到以下錯誤: C:\ Documents and Settings \ zchoy \ Desktop \ Test>「C: \ Program Files \ gnuwin32 \ bin \ sed.exe「-i.bak」s/bad/good/g「*。* sed.exe:無法讀取新建文件夾:權限被拒絕 我也有一個垃圾文件:sed3aQhvO – 2009-12-02 01:51:55

1

Cygwin的軟管上的文件的ACL有時文件,你可能不得不使用CACLS或chmod命令修復然後才能刪除文件。

+0

不幸的是,我沒有安裝Cygwin。 – 2010-01-11 21:59:48

+1

@Zian cacls是一個內置的Windows應用程序,和xcacls(新的'cacls')一樣。另外,我應該提到GnuWin32的sed很可能也有這個問題 – 2010-01-12 00:42:10

1

這裏有一些故障排除進入。當您從命令行運行批處理文件時會發生這種情況嗎?如果你在命令行上的單個文件上運行sed,它會爲每個文件創建這些文件,還是隻爲某些文件/文件類型創建?這是否只發生在替換,或者一般的替換,或者只是當你在一個文件上運行sed.exe?它只是sed創建這些文件,或所有Gnuwin32 exe的(如。awk,貓等)?從一個新安裝的Gnuwin32的sed.exe發生同樣的事情嗎?當您嘗試刪除文件時它會給出什麼錯誤信息?命令提示符仍處於打開狀態時,是否可以從資源管理器中刪除文件?如果關閉命令提示符並重新打開它,然後嘗試刪除文件呢?

0

這是黑暗中的刺,但如果sed的gnuwin32實現是duff(即,以某種方式錯誤),它至少不會讓我感到驚訝。您是否可以嘗試使用支持windows的AT&T U/Win POSIX來複制問題?它很容易安裝,包括Korn外殼,sedfind,因此您可以使用find而不是FOR /R。 (我想知道是否問題的一部分是MS FOR和gnuwin32 sed不能很好地一起玩。)

3

由於這是與-i選項sed的一個已知的錯誤,你可以運行attrib -R <filename>只去除讀來自sed完成後文件的屬性。

或者,不要使用-i選項並將輸出重定向到新文件,然後刪除並重命名輸入和輸出。

+0

或運行attrib -R 在運行之前「sed -i」 – mjohnsonengr 2014-12-05 18:02:15

0

我意識到這是一條舊線索,但它仍然是一個問題。我的修補程序是在sed後將 「DEL sed *」添加到批處理文件的末尾。快速和骯髒。

+0

我想到了這一點,不幸的是,這種創可貼對我來說不起作用,原因有兩個: 1.我有文件在我的項目中,名稱以sed開頭。 2.在我的項目上工作的任何開發人員都可以添加名稱以sed開頭的其他文件。 – 2017-05-11 20:18:01

0

我使用這個命令來清理由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