誰もが読めるようにしたいファイルがあるのに、世界中で実行できないディレクトリのいくつかの層の奥にある場合は、パス全体とファイルの権限を変更する必要があります。
できます chmod 755 -R /first/inaccessible/parent/dir
しかし、これにより、パスディレクトリ内の他のすべてのファイルのアクセス許可が変更され、ファイルを読み取り可能にするだけで、ファイル自体が実行可能になります。
これをbashで簡単に行う方法はありますか?
統合 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つの方法:
#! /bin/sh
fname=/full/path/to/file
dir=${fname%/*}
while [ x"$dir" != x ]; do
chmod 0755 "$dir"
dir=${dir%/*}
done
chmod 0644 "$fname"
これにより、サブフォルダが0755に変更されます
_find /first/inaccessible/parent/dir -type d -exec chmod 0755 {} \;
_
これによりファイルが検索され、その権限が変更されます
chmod +r $(find /first/inaccessible/parent/dir -type f -name YourFileName)
お役に立てば幸いです。 (参考:デフォルトでは、フォルダには0755が必要です)