web-dev-qa-db-ja.com

Cygwin bashsedがファイルをロックします

Sedコマンドを使用してcygwinbashのファイルを変更すると、ファイルがロックされます。

再現:

  1. cmdcd非ユーザーディレクトリに開きます(例:temp
  2. echo aaa > test.txt
  3. テキストエディタで開き、行を追加し、保存してみてください=>動作します
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt "
  5. Texteditorで、別の行を追加して保存してみてください=> "アクセスが拒否されました"

WTF?!ロックせずにファイルをsedしたり、後でファイルハンドルを解放したりするにはどうすればよいですか?

  • Windowsのセキュリティ権限がファイルに完全にねじ込まれているようです。

    以前の権限:

    permissions before (Image!)

    後の権限:

    permissions after (Image!)

  • ただし、ユーザーディレクトリ(Desktop)では機能します

  • LockHunterでファイルをチェックしましたが、ファイルをロックするプロセスが表示されません
  • Cygwin FAQ いくつかのプログラムへの干渉について言及しています。 AntivirとCatalystをアンインストールして再起動してみました。
  • やってみる UnxTools (クラッシュ)、 GnuWin32 (sedはインプレース置換をサポートしていません)、 Interex (インストーラーはW7 Proをサポートしていません)... *ため息*
12
user43881

Cygwin Mailinglist に対応し、マウントにはnoaclを使用します

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

またはWindowsで直接../cygwin/fstab Cygwinbashを開始する前

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

Findをgrepと組み合わせて使用​​し、cygwinでsedを使用して、Javaソースコードファイルでいっぱいのフォルダーを自動的に処理した後、まったく同じ問題が発生しました。SedめちゃくちゃになりましたファイルのNTFSファイルのアクセス許可は、再起動後も保持されていたため、これを修正する簡単な方法を探しました。

私は実際にファイルのパーミッションを古い値に戻す簡単な方法を見つけました。一度に非常に多くのファイル(数百)を変更したので、これはフォルダー全体に対して再帰的に実行できます。これは私にとって重要です。残念ながら、私はメニューエントリのドイツ語の名前しか知らないので、(Windowsエクスプローラーの)メニューエントリが正しい英語でどのように呼び出されるのかわかりません。

ドイツ語では、次のようにします。sedを使用したフォルダーの親フォルダー、「Eigenschaften」(コンテキストメニュー)、「Sicherheit」(ダイアログのタブ)、「Erweitert」(ボタン)、「Berechtigungenändern...」を右クリックします。 "(UACプロンプト付きのボタン)、両方のチェックボックスをオンにするだけです(上のチェックボックスは既に設定されていますが、下のチェックボックスは設定されていませんが、設定する必要があります)。今度は「OK」を3回クリックします。

これによって行われる実際の変更は、下のチェックボックスにより、Windowsがフォルダーの内容に対する現在のアクセス許可を、右クリックしたフォルダーのアクセス許可に再帰的に置き換えることです。これにより、壊れたアクセス許可はすべて修正されます。私にとっては魅力のように機能し、また非常に高速です(多くのファイルに対してわずか数秒)。

可能な翻訳(私が推測):

  • 「Eigenschaften」->「プロパティ」
  • 「Sicherheit」->「セキュリティ」
  • 「Erweitert」->「Advanced」
  • 「Berechtigungenändern...」->「権限の変更...」
5
Rolf Viehmann

私は独自のテストセットを実行しましたが、実際、sedコマンドと後続のcygwinコマンドがこれを読み取り専用ファイルとして認識した後、ファイルのアクセス許可はr-xr-x ---に設定されます。

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>
2
Stephen Quan