ディレクトリの権限と所有者を再帰的にチェックし、それらを再作成するためのシェルスクリプトを作成するスクリプト

ディレクトリの権限と所有者を再帰的にチェックし、それらを再作成するためのシェルスクリプトを作成するスクリプト

複数のサブディレクトリを持つ大きなディレクトリ内のすべての権限/グループを変更したり、適切に作成されなかったり、別のマシン上のこのディレクトリのユーザー/権限をミラーリングしたりする場合に備えて、それらを維持し、書き換えるシェル スクリプトを作成しようとしています。

何かのようなもの:

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 ベースの OS では、パッケージ に存在しますinotify-tools

関連情報