12

Когда я изменяю файлы в cygwin bash с помощью команды sed, файл блокируется.

Воспроизводить:

  1. Откройте cmd и cd для непользовательского каталога (например, temp)
  2. echo aaa > test.txt
  3. Откройте в texteditor, добавьте строку, попробуйте сохранить => работает
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt "
  5. В texteditor добавьте еще одну строку и попытайтесь сохранить => "Доступ запрещен"

WTF?! Как я могу сохранить файл без блокировки или впоследствии освободить его?

  • Разрешения безопасности Windows, похоже, полностью прикручены к файлу:

    Разрешения до:

    разрешения до (изображение!)

    Разрешения после:

    разрешения после (Изображение!)

  • Однако он работает в пользовательском каталоге (Desktop)

  • Я проверил файл с помощью LockHunter, но процесс блокировки файла не отображается
  • Cygwin FAQ упоминает о помехах в некоторых программах. Он попытался удалить Antivir и Catalyst и перезагрузить компьютер.
  • Попытка UnxTools (вылетает), GnuWin32 (sed не поддерживает подстановку на месте), Interex (установщик не поддерживает W7 Pro) ... * вздох *

3 ответа3

8

соответствующий списку рассылки Cygwin, используйте noacl для монтирования

$ mount -o binary,posix=0,user,noacl C:/tmp /mnt/tmp

или непосредственно в Windows ../cygwin/fstab перед запуском Cygwin bash

C:/tmp /mnt/tmp ntfs binary,posix=0,user,noacl 0 0
4

У меня была точно такая же проблема после использования find в сочетании с grep и sed в cygwin для автоматической обработки папки, полной файлов исходного кода Java. Сед испортил разрешения файлов NTFS для моих файлов, которые оставались постоянными после перезагрузки, поэтому я искал простой способ исправить это.

Я на самом деле нашел простой способ вернуть права доступа к файлам к старым значениям. Это можно сделать для всей папки рекурсивно, что важно для меня, так как я изменил сразу столько файлов (несколько сотен). К сожалению, я знаю только немецкие имена для пунктов меню, поэтому я не уверен, как пункты меню (в Windows Explorer) вызываются на правильном английском языке.

На немецком языке вы делаете: щелкните правой кнопкой мыши на родительской папке папки, в которой я использовал sed, "Eigenschaften" (контекстное меню), "Sicherheit" (вкладка в диалоговом окне), "Erweitert" (кнопка), «Berechtigungen ändern ... "(кнопка с подсказкой UAC), теперь я просто проверяю оба флажка (верхний уже установлен, но нижний нет, но должен быть). Теперь я нажимаю "ОК" три раза.

Фактическое изменение, сделанное этим, заключается в том, что нижний флажок заставляет Windows рекурсивно заменять текущие разрешения для содержимого папки разрешениями для папки, которую вы щелкнули правой кнопкой мыши, поэтому все сломанные разрешения будут исправлены. Работал для меня как шарм, а также очень быстро (всего несколько секунд для большого количества файлов).

Возможные переводы (угадал я):

  • "Eigenschaften" -> "Недвижимость"
  • "Sicherheit" -> "Безопасность"
  • "Erweitert" -> "Продвинутый"
  • "Berechtigungen ändern ..." -> "Изменить разрешения ..."
2

Я запустил свой собственный набор тестов, и, действительно, права доступа к файлу устанавливаются в r-xr-x --- после того, как команда sed и последующие команды cygwin воспримут это как файл только для чтения.

C:\Temp>echo aaa > test.txt
C:\Temp>ls -l
total 1
----------+ 1 bikeguy ???????? 6 Feb 21 08:51 test.txt
C:\temp>sed -i 's/aaa/bbb/' test.txt
C:\temp>cat test.txt
bbb
C:\temp>ls -l test.txt
-r-xr-x---+ 1 bikeguy mkgroup-l-d 5 Feb 21 08:52 test.txt
C:\temp>

Эти разрешения -r-xr-x --- предотвращают последующую запись некоторыми программами:

C:\temp>echo xxx > test.txt
Access is denied.
C:\temp>

Таким образом, обходной путь должен был бы добавить дополнительный chmod в файл

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .