Sedコマンドを使用してcygwinbashのファイルを変更すると、ファイルがロックされます。
再現:
cmd
とcd
を非ユーザーディレクトリに開きます(例:temp
)echo aaa > test.txt
%CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt
"WTF?!ロックせずにファイルをsedしたり、後でファイルハンドルを解放したりするにはどうすればよいですか?
Windowsのセキュリティ権限がファイルに完全にねじ込まれているようです。
以前の権限:
後の権限:
ただし、ユーザーディレクトリ(Desktop
)では機能します
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
Findをgrepと組み合わせて使用し、cygwinでsedを使用して、Javaソースコードファイルでいっぱいのフォルダーを自動的に処理した後、まったく同じ問題が発生しました。SedめちゃくちゃになりましたファイルのNTFSファイルのアクセス許可は、再起動後も保持されていたため、これを修正する簡単な方法を探しました。
私は実際にファイルのパーミッションを古い値に戻す簡単な方法を見つけました。一度に非常に多くのファイル(数百)を変更したので、これはフォルダー全体に対して再帰的に実行できます。これは私にとって重要です。残念ながら、私はメニューエントリのドイツ語の名前しか知らないので、(Windowsエクスプローラーの)メニューエントリが正しい英語でどのように呼び出されるのかわかりません。
ドイツ語では、次のようにします。sedを使用したフォルダーの親フォルダー、「Eigenschaften」(コンテキストメニュー)、「Sicherheit」(ダイアログのタブ)、「Erweitert」(ボタン)、「Berechtigungenändern...」を右クリックします。 "(UACプロンプト付きのボタン)、両方のチェックボックスをオンにするだけです(上のチェックボックスは既に設定されていますが、下のチェックボックスは設定されていませんが、設定する必要があります)。今度は「OK」を3回クリックします。
これによって行われる実際の変更は、下のチェックボックスにより、Windowsがフォルダーの内容に対する現在のアクセス許可を、右クリックしたフォルダーのアクセス許可に再帰的に置き換えることです。これにより、壊れたアクセス許可はすべて修正されます。私にとっては魅力のように機能し、また非常に高速です(多くのファイルに対してわずか数秒)。
可能な翻訳(私が推測):
私は独自のテストセットを実行しましたが、実際、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>