web-dev-qa-db-ja.com

サブディレクトリでのみchmodする方法?

次のディレクトリツリーがあるとします。

.
├── 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 *

しかし、これは親ディレクトリのモードも変更しますが、これは望ましくありません。

7
Meysam

最上位ディレクトリではワイルドカードを使用できます。

chmod 774 d*/workspace

または、より具体的にするために、ワイルドカードを制限することもできます。たとえば、dの後に1桁を続けます。

chmod 774 d[0-9]/workspace

より一般的なアプローチは、findを使用することです。

find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;
17
Thomas

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[@]}"
_
4
Inian

chmodコマンドには、次のように、ディレクトリにのみ実行可能ビットを設定するための素晴らしいショートカットがあります。

chmod a+X *

これは、ディレクトリツリー全体をだれでも読めるようにするのに非常に便利ですが、通常のファイルに実行可能ビットを設定するのではありません。

chmod -R a+rX *
0
G. Sliepen