web-dev-qa-db-ja.com

すぐにファイルを読み取り可能にし、そのパスを実行可能にしますか?

誰もが読めるようにしたいファイルがあるのに、世界中で実行できないディレクトリのいくつかの層の奥にある場合は、パス全体とファイルの権限を変更する必要があります。

できます chmod 755 -R /first/inaccessible/parent/dirしかし、これにより、パスディレクトリ内の他のすべてのファイルのアクセス許可が変更され、ファイルを読み取り可能にするだけで、ファイル自体が実行可能になります。

これをbashで簡単に行う方法はありますか?

5
LangeHaare

統合 chepner's astute comment のみに関するディレクトリreally実行権限が必要:

セットアップ:

$ mkdir -p /tmp/lh/subdir1/subdir2/subdir3
$ touch /tmp/lh/subdir1/subdir2/subdir3/filehere
$ chmod -R 700 /tmp/lh
$ find /tmp/lh -ls
16    4 drwx------   3 user  group        4096 Oct 23 12:01 /tmp/lh
20    4 drwx------   3 user  group        4096 Oct 23 12:01 /tmp/lh/subdir1
21    4 drwx------   3 user  group        4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2
22    4 drwx------   2 user  group        4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3
23    0 -rwx------   1 user  group           0 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3/filehere

準備:

$ f=/tmp/lh/subdir1/subdir2/subdir3/filehere

やれ:

$ chmod o+r "$f"
$ (cd "$(dirname "$f")" && while [ "$PWD" != "/" ]; do chmod o+x .; cd ..; done)
chmod: changing permissions of `.': Operation not permitted
$ find /tmp/lh -ls
16    4 drwx-----x   3 user  group        4096 Oct 23 12:01 /tmp/lh
20    4 drwx-----x   3 user  group        4096 Oct 23 12:01 /tmp/lh/subdir1
21    4 drwx-----x   3 user  group        4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2
22    4 drwx-----x   2 user  group        4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3
23    0 -rwx---r--   1 user  group           0 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3/filehere

中間ディレクトリが他の実行権限も持つようにする場合は、chmodコマンドをchmod o+rxに変更します。

上記のエラーメッセージは、root以外のユーザーIDが、所有していない/tmpディレクトリの権限を変更しようとしたために発生しました。

ループはサブシェルで実行され、ディレクトリの変更を現在のシェルの$ PWDから分離します。ファイルを含むディレクトリに入り、ループを開始し、ルート/ディレクトリに到達するまで、途中でchmodしてループします。ループは、ルートディレクトリに到達すると終了します。ルートディレクトリのchmodは試行されません。

次のように、スクリプトファイルまたは関数から作成できます。

function makeitreadable() (
  chmod o+r "$1"
  cd "$(dirname "$1")" &&
    while [ "$PWD" != "/" ]
    do
      chmod o+x .
      cd ..
    done
)
1
Jeff Schaller

それを行う1つの方法:

#! /bin/sh
fname=/full/path/to/file
dir=${fname%/*}
while [ x"$dir" != x ]; do
    chmod 0755 "$dir"
    dir=${dir%/*}
done
chmod 0644 "$fname"
7
Satō Katsura

これにより、サブフォルダが0755に変更されます

_find /first/inaccessible/parent/dir -type d -exec chmod 0755 {} \;_

これによりファイルが検索され、その権限が変更されます

chmod +r $(find /first/inaccessible/parent/dir -type f -name YourFileName)

お役に立てば幸いです。 (参考:デフォルトでは、フォルダには0755が必要です)

0
sys0dm1n