Cygwin bash sed блокує мої файли


12

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

Відтворити:

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

WTF ?! Як я можу сідати файл, не блокуючи його, або звільняти ручки файлів після цього?

  • Здається, дозволи на захист Windows повністю накручені на файл:

    Дозволи до:

    дозволи раніше (Зображення!)

    Дозволи після:

    дозволи після (Зображення!)

  • Однак він працює в каталозі користувачів ( Desktop)

  • Я перевірив файл за допомогою LockHunter, але не з'явився жоден процес для блокування файлу
  • Поширені запитання Cygwin згадує перешкоди для деяких програм. Спробували видалити Antivir та Catalyst та перезавантажити.
  • Спробуйте UnxTools (збої), GnuWin32 (sed не підтримує заміну), Interex (інсталятор не підтримує W7 Pro) ... * зітхнення *

2
Це просто звучить як хитра філософія Windows "повинна захищати користувачів від самих себе", я бачу, що весь час намагаюся змішувати та співставляти файли Windows та Cygwin / Linux. Удачі.
обстріл

+1 лямбдор. Я перевірив цю поведінку в Cygwin, і ти маєш рацію. Це досить дивно. Файл не заблокований (тобто як у ньому не використовується). Право на доступ до файлу лише для читання / дозволу на читання змінюється.

Я використовував GnuWin32 sed на W7 64bit і не мав проблем із заміною місця. Це сед 4.2.1, який я завантажив за допомогою проекту getGnuWin32 .
Спенсер Ратбун

Відповіді:


8

відповідно до Cygwin Mailinglist , використовуйте 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

5

У мене були точно такі ж проблеми після використання пошуку в поєднанні з grep і sed під cygwin, щоб автоматично обробляти папку, повну файлів вихідного коду Java. Sed переплутав дозволи файлів NTFS для моїх файлів, які залишалися стійкими після перезавантаження, тому я шукав простий спосіб виправити це.

Я фактично знайшов простий спосіб повернути дозволи на файли до старих значень. Це можна зробити для цілої папки рекурсивно, що для мене важливо, оскільки я змінив стільки файлів одночасно (кілька сотень). На жаль, я знаю лише німецькі назви для записів у меню, тому я не впевнений, як правильно називаються записи меню (у Провіднику Windows) англійською мовою.

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

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

Можливі переклади (як я здогадався):

  • "Eigenschaften" -> "Властивості"
  • "Sicherheit" -> "Безпека"
  • "Ервейтер" -> "Додатково"
  • "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>

дивна річ - маска першого дозволу '---------- + 1 велосипед ????????' який я також зіткнувся з використанням Cygwin / Windows. Тоді ви пишете "Ці дозволи -r-xr-x --- перешкоджають подальшому запису деяким програмним забезпеченням:" Тому, можливо, "деяке програмне забезпечення" працює під іншою групою І тому, що дозволів через "інші" немає доступу, це спричиняє проблема? Дякую, ця налагодження допомогла мені з цією проблемою. Успіхів усім.
обстріл

Так, @shellter Я також помітив це, коли вивчав відповідь. Я припускав, що рядок "----------- +" означає, що захист не існує (тому у вас є повний доступ), тоді як "-r-xr-x --- +" означає, що безпека існує там, де доступ для запису є зниклий безвісти. Якщо я зробив chmod 000, я також отримаю "---------- +", але цього разу напевно є безпека, і я не маю привілеїв читати чи писати цей файл.

Я використовую git версії 1.9.5.msysgit.1, я також бачу ту саму проблему, я використовую chmod 777 test.txtкоманду, щоб вирішити цю проблему.
ollydbg23
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.