コマンドがすべてを一覧表示するシェルスクリプトを生成しようとしています。読み取りと実行可能ユーザーが誰であるか、ユーザーがどこにいるかに関係なく、私または現在のユーザーが許可するファイルです。したがって、後で権限を変更しても、変更は反映され続けます。
これが私が今まで持っているものです:
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
。この回答の主な目的は、将来のスクリプティングの質問に役立つフィードバックを提供することです。
出力を使用して
ls
スクリプトを作成しないでください。初心者がよく犯す間違いです。引用するなぜ`ls`を解析しないのですか?を使用しないで、
ls
単にシェルのネイティブを使用してくださいファイルグロービング、例えば。/home/cg/root/*
。これがこの機能が存在する理由の1つです。あなたのスクリプトはサブディレクトリに落ちませんが、userIporSricerの答えはそうです。
シェルの部分文字列拡張機能を誤って使用しているため、テストは機能しません。 2番目のパラメータは部分文字列です。長さは終了位置ではないため、単一文字のサブストリングが
${perm:1:2}
必要な場合は、2文字のサブストリングが返されます${perm:1:1}
。より速いテストは、フォームの別々の変数を定義し、
owner=${perm:1:2}
「rx」に対してテストすることです。&&
testコマンドでのみ動作すると言っているようで驚きました[
。でしか機能しないと思いました[[
。3つの
if
、elif
すべてがelif
同じことを行うため、論理OR演算子(テスト外)を使用してecho
1つに結合できます。if
||
[
これが役に立つことを願っています。