権限が変更されていても、現在のユーザーに読み取りおよび実行権限があるファイルを確認する方法

権限が変更されていても、現在のユーザーに読み取りおよび実行権限があるファイルを確認する方法

コマンドがすべてを一覧表示するシェルスクリプトを生成しようとしています。読み取りと実行可能ユーザーが誰であるか、ユーザーがどこにいるかに関係なく、私または現在のユーザーが許可するファイルです。したがって、後で権限を変更しても、変更は反映され続けます。

これが私が今まで持っているものです:

user=`id -un`
group=`id -gn`

IFS='
'
for file in `ls -al /home/cg/root`; do
    perm=$(echo $file | awk '{print $1}')
    fileowner=$(echo $file | awk '{print $3}')
    filegroup=$(echo $file | awk '{print $4}')
    ownerreadbit=${perm:1:2}
    ownerexecbit=${perm:3:4}
    groupreadbit=${perm:4:5}
    groupexecbit=${perm:6:7}
    worldreadbit=${perm:7:8}
    worldexecbit=${perm:9:10}
    if ["$user"=="$fileowner" && "$ownerreadbit"=="r" && "$ownerexecbit"=="x"]; then
        echo $file
    elif ["$group"=="$filegroup" && "$groupreadbit"=="r" &&" $groupexecbit"=="x"]; then
        echo $file
    elif ["$worldreadbit"=="r" && "$worldexecbit"=="x"]; then
        echo $file
    fi
done

答え1

GNUfindコマンドを使用しないのはなぜですか?

find /home/cg/root -readable -executable

または、ファイルのリストのみをリストしてください。

find /home/cg/root -readable -executable -type f

答え2

ユーザーIporSricerの答えはfind /home/cg/root -readable -executable正しい選択です。また、このfindコマンドには、ファイルごとにできるだけ多くの詳細を含むオプションを含む、出力形式をカスタマイズできるという追加の利点があります。ページ-printfのオプションを参照してくださいman。この回答の主な目的は、将来のスクリプティングの質問に役立つフィードバックを提供することです。

  1. 出力を使用してlsスクリプトを作成しないでください。初心者がよく犯す間違いです。引用するなぜ`ls`を解析しないのですか?

  2. を使用しないで、ls単にシェルのネイティブを使用してくださいファイルグロービング、例えば。/home/cg/root/*。これがこの機能が存在する理由の1つです。

  3. あなたのスクリプトはサブディレクトリに落ちませんが、userIporSricerの答えはそうです。

  4. シェルの部分文字列拡張機能を誤って使用しているため、テストは機能しません。 2番目のパラメータは部分文字列です。長さは終了位置ではないため、単一文字のサブストリングが${perm:1:2}必要な場合は、2文字のサブストリングが返されます${perm:1:1}

  5. より速いテストは、フォームの別々の変数を定義し、owner=${perm:1:2}「rx」に対してテストすることです。

  6. &&testコマンドでのみ動作すると言っているようで驚きました[。でしか機能しないと思いました[[

  7. 3つのifelifすべてがelif同じことを行うため、論理OR演算子(テスト外)を使用してecho1つに結合できます。if||[

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

関連情報