web-dev-qa-db-ja.com

ディレクトリには実行許可を与えますが、ファイルには与えません

私はファイルとディレクトリを含むディレクトリ構造を持っており、すべてのファイルとディレクトリがユーザーの読み取り/書き込みアクセス許可とグループの読み取りアクセス許可、さらにディレクトリへの実行アクセス許可を持つようにアクセス許可を割り当てるのが好きです。

私はそのようなことを達成したいと思います:

$ ls -l
total 16
-rw-r----- 1 daniel daniel    0  5月 23 16:20 1
-rw-r----- 1 daniel daniel    0  5月 23 16:20 2
-rw-r----- 1 daniel daniel    0  5月 23 16:20 3
-rw-r----- 1 daniel daniel    0  5月 23 16:20 4
-rw-r----- 1 daniel daniel    0  5月 23 16:20 5
drwxr-x--- 2 daniel daniel 4096  5月 23 16:00 a
drwxr-x--- 2 daniel daniel 4096  5月 23 16:00 b
drwxr-x--- 2 daniel daniel 4096  5月 23 15:59 c
drwxr-x--- 2 daniel daniel 4096  5月 23 15:59 d
8
Daniel

ファイルではなくディレクトリに実行(検索)権限を与えるには、次を使用します。

_chmod -R +X .
_

例のようにすべての権限を割り当てるには、次を使用します。

_chmod -R u=rwX,g=rX,o= .
_

_-R_はファイルとディレクトリを再帰的に変更しますが、_+X_は、ファイルがディレクトリであるか、一部のユーザーに対してすでに実行権限を持っている場合にのみ実行/検索を設定します。もちろん、rwはそれぞれ読み取りと書き込み用です。

モードXupperx)は、従来の両方で文書化されています マニュアルページ1 および 情報ドキュメント2

また、他のUnixライクなシステムでも動作するはずです。 FreeBSDNetBSD または OpenBSD 。 The Open Group Base Specification Issue 7、2018 editionの chmod(1) manページからの引用:

[〜#〜] x [〜#〜]permシンボルは、再帰を実行するときに一般的に必要な機能を提供するため、BSDベースのシステムから採用されました(-Rオプション)の変更。同様の機能は、findユーティリティでは提供されません。 chmodの過去のBSDバージョンは、ただし、サポートされているのは[〜#〜] x [〜#〜]withop+; op=でも役立つため、POSIX.1-2017のこのボリュームで拡張されています。 (op-xと重複していても、この場合は追加されています。直感的で説明が簡単です。)


1 _man 1 chmod_
2info '(coreutils)Conditional Executability'

13

ディレクトリ内のディレクトリ内のディレクトリに対して、つまりを再帰的に実行する場合、使用するコマンドは次のとおりです。

 find /path/to/starting/directory -type d -exec chmod +x {} \;

これにより、ディレクトリ/ path/to/startup/directoryのすべてのサブディレクトリ(-type dフラグ)が検索され、それぞれに対して必要な実行権限の変更が実行されます。 \;の前のスペースは必須です。

2
MariusMatutiae

答えてくれてありがとう。ディレクトリにのみ実行権限を割り当てるには、大文字のX権限を使用する必要があることがわかりました。

したがって、コマンドは次のようになります。

chmod -R a-rwx,u=rwX,g=rX .

http://www.manpagez.com/man/1/chmod/

(それを見つけるのに時間がかかったので、みんなと共有したかった。今、この質問は、知りたい次の人のためにグーグルで索引付けされると思う)

0
Daniel

次のようなことを試しましたか?

chmod +x $(ls -p | grep /)、これはディレクトリのみに実行許可を追加します

また、ファイルやディレクトリに実行権限を付与したい場合は、次のようにしてください。

chmod +x *およびファイルに対して実行する権限を削除するには、次のような方法を試してください。

chmod -x *.*

それが役立つことを願っています

0
BigFoot
chmod -R u=rwX,g=rX,o= .

大文字のXは、すでに別の場所に設定されている場合にのみ設定されることを意味します。すべてのディレクトリはすでにユーザーに対して実行可能であるため、グループに対しても実行可能になります。ファイルはユーザーに対して実行可能ではないため、グループに対しても実行可能になりません。

chmod +Xを使用すると、実行権限が付与されるときにユーザー、グループなどに実行権限が付与されることを除いて、ほぼ同じ効果があります。

0
jornane

これを試して:

find . -mindepth 1  -print0 | while IFS= read -r -d '' file; do
    if [ -d "$file" ]; then chmod 750 "$file";
    else chmod 640 "$file"; fi
done

説明

  • -mindepth 1:そのため、findは現在のディレクトリ.と一致しません。
  • -print0:nullで区切られた出力を出力します。これにより、改行を含むファイルを正しく処理できます。
  • while IFS=IFSを空の文字列に設定すると、単語の分割がオフになります。空白のあるファイル/ディレクトリ名に必要です。
  • read -r -d '':これは各行を$fileに読み込みますが、-rは、\を特別に処理しないことを保証します(ファイル名にいくつかある場合)および-d ''区切り文字をnull文字列に設定して、findの出力を正しく解析し、改行を含むファイル名を処理できるようにします。
  • if [ -d "$file" ]; then chmod 750 "$file";$fileがディレクトリの場合([ -d "$file" ]、その権限をdrwxr-x---に設定します。
  • else chmod 640 "$file"; fi:ディレクトリでない場合は、-rw-r-----に設定します。
0
terdon