ディレクトリの権限と所有者を繰り返し確認し、それを再生成するシェルスクリプトを作成するスクリプト

ディレクトリの権限と所有者を繰り返し確認し、それを再生成するシェルスクリプトを作成するスクリプト

複数のサブディレクトリを持つ大きなディレクトリのすべての権限/グループが変更または正しく作成されていない場合は、それを保存して書き換えるか、このディレクトリのユーザー/権限を別のコンピュータにミラーリングするためのシェルスクリプトを作成しようとします。

それは次のとおりです。

chown adam:brown /var/blarg
chmod 770 /var/blarg
chown adam:brown /var/blarg/toast.file
chmod 777 /var/blarg/toast.file

...etc

この操作を手動で実行すると時間がかかります。これを行うための既存のコマンド/スクリプトがあるかどうか疑問に思います。

答え1

@yetiさんのコメントに続き、しばらく前にこれについて考えてみたところ、次のような結論に達したことが思い出されます。

find /path/to/dir -printf '%m\t%u\t%g\t%p\0' > filelist

それから

while read -rd $'\0' perms user group file; do 
  if [ -e "$file" ]; then
    chown "$user:$group" "$file"
    chmod "$perms" "$file"
  else
    echo "warning: $file not found"
  fi
done < filelist

動作します。出力の末尾にファイル名を入れ、read改行の代わりにヌル終端を使用します。しなければならないこれにより、ファイル名にスペースやその他の特殊文字が含まれている場合でもセキュリティが保証されます。 2番目のコマンドを実行したい場所に応じて、/path/to/dirコマンドの前のコンポーネントが削除されたファイル名を使用します。find%P%p

答え2

Yetiがコメントで提案したように、findコマンドを使用してディレクトリ内のすべてのファイルとディレクトリを見つけ、その権限/所有者をchownまたはchmodコマンドとして出力します。-v生成されたシェルスクリプトを実行したときにコマンドの成功/エラーを表示できるように、詳細情報の表示オプションを追加しました。

find /var/blarg -printf 'chown -v %u:%g %p\n' > chowns.sh
find /var/blarg -printf 'chmod -v %m %p\n' > chmods.sh

次に、生成された.shファイルを実行可能にします。

chmod +x chowns.sh; chmod +x chmods.sh

次に実行し、詳細なフィードバックをtxtファイルに出力します。

./chmods > chmods_results.txt

繁栄。

答え3

eventsあなたがいたならば、私はそう言ったでしょう。本物ファイルが多い場合は、これらのファイルを監視することをお勧めします。inotifywatchファイル権限の変更などの「ファイルシステムイベントを受信する」方法を検討することをお勧めします。 Debianベースのオペレーティングシステムではパッケージにありますinotify-tools

関連情報