次のディレクトリツリーがあるとします。
.
├── d1
│ └── workspace
├── d2
│ └── workspace
├── d3
│ └── workspace
├── d4
│ └── workspace
└── d5
└── workspace
以下のように、すべてのworkspace
ディレクトリの権限を設定する必要があります。
chmod -R 774 d1/workspace
chmod -R 774 d2/workspace
...
すべてのworkspace
ディレクトリに対して上記の操作を1つのコマンドで実行するにはどうすればよいですか?次のコマンドを実行できます。
chmod -R 774 *
しかし、これは親ディレクトリのモードも変更しますが、これは望ましくありません。
最上位ディレクトリではワイルドカードを使用できます。
chmod 774 d*/workspace
または、より具体的にするために、ワイルドカードを制限することもできます。たとえば、d
の後に1桁を続けます。
chmod 774 d[0-9]/workspace
より一般的なアプローチは、find
を使用することです。
find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;
bash
のようなシェルでは、拡張グロビングオプションを使用して、最初にworkspace
およびchmod
という名前のすべてのディレクトリにマークを付けることができます
_shopt -s nullglob globstar
_
オプションnullglob
は、グロブ展開がエラーをスローしないことを確認するためのものですnotパス内のファイルを検索します。また、これにより、空のグロブ文字列が配列の一部として含まれないようになります。 globstar
オプションは、再帰的グロビングに対して有効です。
次に、シェル配列内のこれらのディレクトリを次のようにマークします。
_dirs=(**/workspace/)
_
もう1つの健全性チェックとして、最初に配列を出力して、必要なすべてのディレクトリが処理されているかどうかを確認できます。以下のprintf()
コマンドを実行するときに、すべてのディレクトリが以下にリストされているかどうかを確認してください。
_printf '%s\n' "${dirs[@]}"
_
これにより、すべての再帰的なworkspace
フォルダが配列に入力されます。ここで、chmod
を使用する必要があります
_(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"
_
chmod
コマンドには、次のように、ディレクトリにのみ実行可能ビットを設定するための素晴らしいショートカットがあります。
chmod a+X *
これは、ディレクトリツリー全体をだれでも読めるようにするのに非常に便利ですが、通常のファイルに実行可能ビットを設定するのではありません。
chmod -R a+rX *