回答:
フォルダーa
に移動b
しているときに、に移動するとc
、のフォルダーのアクセス許可a
によって、実行できる操作が決まります。
この場合、の権限.
が最も重要になります。
権限は単純なものよりも複雑であることを確認してくださいrwx
。あなたのmusic
フォルダがあり@
最後に、.
フォルダがあり+
最後に。
xattr -h
@記号の複雑な権限を判別するために使用します。getfacl
+記号のACLを判別するために使用します。ls -la@e
。最も可能性が高いのは、deny delete
名前の変更を防ぐACL があったことです。
LinuxにはWindowsサブシステムを使用していました。別のbashインスタンスでディレクトリを開いていました。それを閉じると、ディレクトリが移動します。
そのディレクトリのどこかに少なくとも1つのファイルがあり、適切な権限がありませんでした。
だから、私がしたことは:
sudo chown -R valmar ./Music
sudo chmod -R 755 ./Music
今では動作します。
chmod 755
Musicフォルダーの特別な「@」権限を削除した可能性はありますか?
chmod -a 'everyone deny delete' Music
。El Capitanでは異なる場合があります。
ここでの問題は、Musicフォルダーのアクセス制御リスト(ACL)に関係している可能性があります。ACLは、通常でリストされる通常のPOSIXのものとは別の権限システムls -l
です。ホームフォルダーおよび他の場所にある他のいくつかのディレクトリにもACLがあります。
ホームディレクトリ内のACLを表示するには、次を使用します。
/bin/ls -le ~
0: group:everyone deny delete
Musicディレクトリのようなルールが表示されるはずです。お気づきのように、で問題を上書きできますsudo
。それをしたくない場合(またはできない場合)、ファイルの所有者であれば、他のオプションがあります。インデックス(上記の例では0)に基づいて、MusicディレクトリのACLから問題のエントリを削除できます。
/bin/chmod -a# 0 Music
または、ACLのすべてのエントリを削除できます。
/bin/chmod -N Music
これで、ディレクトリを移動できます(通常のPOSIX権限が必要です)。移動後にACLを元に戻す場合は、次を使用できます。
/bin/chmod +a "group:everyone deny delete" Music_tmp
/bin/ls -le
もう一度使用して、ACLが希望どおりであることを確認します。詳細については、のACLの例man chmod
をご覧ください。特に、このイントロは役に立ちます:
各ファイルには1つのACLがあり、エントリの順序付きリストが含まれています。各エントリはユーザーまたはグループを参照し、一連の権限を付与または拒否します。ユーザーとグループが同じ名前で存在する場合、名前のタイプを指定するために、ユーザー/グループ名の前に「user:」または「group:」を付けることができます。
manページは順序付けに関する規則を説明しているとは思わないが、このページはACLの順序規則を明確に説明している。特に、明示的deny
ルールは明示的ルールの前に適用されallow
ます。したがって、group:everyone deny delete
エントリが配置されている限り、allow
ルールを使用して削除する権限をユーザーに与えることはできません。これは、everyone
あなたを含むグループへのアクセスが拒否され、そのルールが最初に適用されるためです。
everyone deny delete
macOSのデフォルトのホームディレクトリのACLエントリは、ディレクトリを移動または削除できない実際の理由です。(また、OSがいつでも再作成する可能性があることに注意してください。)
削除しようとしたディレクトリで一連のプログラムが実行されていると、この問題が発生しました。ディレクトリを移動するには、まずそのディレクトリから実行中のすべてのプログラムを強制終了する必要がありました。
次のコマンドでは、プログラムの名前の選択方法に十分注意してください。参考のために、次のコマンドを使用しました。
ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep
# make sure that you are only about to kill the programs you want to kill
ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep | awk '{print $2}' | sudo xargs kill -9
sudo mv /usr/local/[DIR_FOR_ANNOYING_PROGRAM] /usr/local/[DIR_FOR_ANNOYING_PROGRAM]2
一般的な手順は次のとおりです。
kill -9
が必要)。grep
。最初に何を入れよgrep
うとも、実行中のすべてのプログラムのプールから選択し、kill
それをルート特権で...
これは、内部のファイルの1つが書き込み保護されている場合にも発生する可能性があります。今日、access.log
Apacheに対して書き込み保護されていたエッジケースがありましたが、Apacheはすでに停止されていました。このファイルを削除したので、さらに親ディレクトリを移動することができました。