Подтвердить что ты не робот

Sed создает не удаляемые файлы в Windows

Я пытаюсь запустить следующую команду в Windows Server 2003, но sed создает кучу файлов, которые я не могу удалить из командной строки внутри текущего каталога.

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.
  • Sed создает файлы
4b9b3361

Ответ 1

Я воспроизвел вашу установку, и у меня есть следующие наблюдения.

  • Я не думаю, что в цикле есть проблема. Простая команда "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g". - создает один и тот же набор временных файлов.
  • Файлы действительно созданы sed. sed создает эти временные файлы, когда включена опция "на месте" (-i). В обычном режиме sed фактически удаляет файлы (это то, что происходит в cygwin), используя вызов библиотеки "unlink". В случае gnuwin32, похоже, что "unlink" терпит неудачу. Я не мог понять, почему. Я предположил, что, возможно, вызов unlink зависит от библиотеки gnuwin32 'coreutils' и попытался загрузить и установить библиотеку coreutils - без костей.
  • Если вы удалите ограничение "только для чтения" в родительской папке перед выполнением команды sed, вы можете удалить временные файлы из командной строки Windows. Это должно дать вам некоторую временную отсрочку.

Думаю, теперь у нас достаточно информации, чтобы поднять отчет об ошибке. Если вы согласитесь, я думаю, что это может быть хорошей идеей привлечь внимание к хорошим людям, ответственным за gnuwin32, и попросить их о помощи.

Между тем, следующая версия очищает свой временный файл:

Ответ 2

Поскольку это известная ошибка в sed с опцией -i, вы можете запустить attrib -R <filename>, чтобы удалить атрибут read only из файла после завершения sed.

В качестве альтернативы не используйте параметр -i и перенаправляйте вывод в новый файл, а затем удаляйте и переименовывайте ввод и вывод.

Ответ 3

Cygwin иногда шьет ACL в файлах, вам, вероятно, придется использовать cacls или chmod, чтобы исправить его, прежде чем вы сможете удалить файл.

Ответ 4

В этом случае возникает проблема с поиском неисправностей. Это происходит, когда вы запускаете эту команду из командной строки и пакетного файла? Что делать, если вы запускаете sed в отдельном файле в командной строке - создает ли эти файлы для каждого файла или только определенные файлы/типы файлов? Это происходит только для этой замены или всех замен вообще, или просто всегда, когда вы запускаете sed.exe в файле? Это только sed, создающий эти файлы, или все Gnuwin32 exe (например, awk, cat и т.д.)? То же самое происходит с sed.exe с новой установки Gnuwin32? Какое сообщение об ошибке оно дает при попытке удалить файлы? Можете ли вы удалить файлы из проводника, пока командная строка все еще открыта? Что делать, если вы закрываете командную строку и открываете ее снова, а затем пытаетесь удалить файлы?

Ответ 5

вы можете просто запустить sed без цикла

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

Ответ 6

Это удар в темноте, но это нисколько не удивит меня, если реализация gnuwin32 sed будет duff (т.е. ошибочной в некотором роде). Можете ли вы попытаться воспроизвести проблему, используя AT & T U/Win Поддержка POSIX для окон? Он прост в установке и включает оболочку Korn, sed и find, поэтому вы можете использовать find вместо FOR /R. (Мне интересно, если часть проблемы в том, что MS FOR и gnuwin32 sed не играют хорошо вместе.)

Ответ 7

Я понимаю, что это старый поток, но это все еще проблема. Мое исправление заключается в том, чтобы добавить "DEL sed *" до конца командного файла после sed. Быстрая и грязная.

Ответ 8

Я использую эту команду для очистки временных файлов, созданных gnuwin32 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