ディレクトリ内のすべてのファイルの権限を変更するスクリプトを作成しました。
#!/bin/bash
files=`find "$1"`
for f in $files; do
chown "$2" "$f"
chmod 600 "$2"
done
明らかに、chmod の 2 番目の引数は"$f"
ではなく である必要があります"$2"
。しかし、スクリプトを実行したとき (小さなディレクトリで)、 であるべき 2 番目の引数も含めるのを忘れていました"dave:dave"
。これで、ディレクトリ内のすべてのファイルが完全にめちゃくちゃになりました。
~ $ ll Documents/
ls: cannot access Documents/wiki.txt: Permission denied
ls: cannot access Documents/todo.txt: Permission denied
ls: cannot access Documents/modules.txt: Permission denied
ls: cannot access Documents/packages.txt: Permission denied
total 0
-????????? ? ? ? ? ? modules.txt
-????????? ? ? ? ? ? packages.txt
-????????? ? ? ? ? ? todo.txt
-????????? ? ? ? ? ? wiki.txt
実行してsudo chown dave:dave Documents/*
もsudo chmod 600 Documents/*
エラーは発生しませんが、ファイルは変更されません。sudo cat
各ファイルを新しいファイルに分割できることはわかっていますが、元のファイルの権限を修正する方法が知りたいです。
答え1
コメントに記載されている回答に加えて、スペースが含まれるファイル名があるとスクリプトが動作しなくなることにも注意してください。
find
から出力されるファイル名のリストを解析するのではなく、を使用してこれをすべて 1 つのコマンドで実行できますfind
。 より堅牢で、特殊文字や空白に関係なくファイル名を処理します。
find "$1" -type f -exec chown "$2" {} \; -exec chmod 600 {} \;
chown
特定のファイルでが失敗した場合、 はchmod
そのファイルでは実行されないことに注意してください。 いずれにしても、これがおそらく必要な動作です。
すでに誤ったコマンドを実行して「Documents」ディレクトリから実行権限を削除しているため、実行権限を再度追加する必要があります。
chmod u+x Documents
実行権限が誤って削除されたディレクトリが他にもある場合は、次のコマンドで修正できます。
find Documents -type d -exec chmod u+x {} \;
ただし、実行権限が「Documents」から削除されると、そのサブディレクトリにはアクセスできなくなるため、実行権限は削除されないため、これは必要ないと思います。
答え2
私がこのような奇妙な権限を持つファイルを見たのは、真剣にファイルシステムが壊れました。 を 1 回実行したところ、ほとんどfsck(8)
のファイルは比較的正常に戻りましたが、まだかなり破損しているファイルも多数ありました。ハードウェアの問題が原因だと思います (ディスクから正常なファイルを取り出して、捨てました)。