Sed создает не удаляемые файлы в Windows - PullRequest
18 голосов
/ 01 декабря 2009

Я пытаюсь запустить следующую команду в 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 создает файлы

Ответы [ 8 ]

22 голосов
/ 13 января 2010

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

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

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

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

3 голосов
/ 20 августа 2014

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

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

1 голос
/ 10 января 2010

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

1 голос
/ 10 января 2010

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

0 голосов
/ 07 ноября 2017

Я использую эту команду для очистки временных файлов, созданных sed gnuwin32 :

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
0 голосов
/ 30 апреля 2015

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

0 голосов
/ 12 января 2010

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

0 голосов
/ 01 декабря 2009

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

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