LSとGREPを使用して実行可能ファイルを見つけます
質問
ディレクトリ内のすべての実行可能ファイルを見つけるスクリプトを作成する必要があります。そこで、私はそれを実装するためにいくつかの方法を試しましたが、実際には機能します。しかし、私はそうするためのより良い方法があるのだろうか。
これが私の最初のアプローチでした:
ls -Fla | grep \*$
-fフラグが私のために作業を行い、各実行可能ファイルにアスタリスクを追加するため、これは正常に機能しますが、アスタリスクサインが気に入らないとしましょう。
これが2番目のアプローチでした:
ls -la | grep -E ^-.{2}x
これも正常に機能します。最初のキャラクターとしてダッシュが必要です。次の2人のキャラクターには興味がなく、4番目のキャラクターはXでなければなりません。
しかし、ユーザー、グループ、またはその他の実行可能な許可を確認する必要があるかどうかわからないため、要件には少しあいまいさがあります。だからこれはうまくいくでしょう:
ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x
それで、私は4番目、7番目、10番目の文字をxであるとテストしています。
さて、私の本当の質問は、LSとGrepを使用してRegexを使用して次のように言うより良い解決策があることです。
私はそれらのファイルのみをグレップしたいと思います。 ls -la
解決
LSを使用する必要がありますか? Findを使用して同じことをすることができます。
find . -maxdepth 1 -perm -111 -type f
現在のディレクトリ内のすべての実行可能ファイルを返します。 -maxdepthフラグを削除して、すべてのチャイルドディレクトリを横断します。
このテリブネスを試すことはできますが、権限のように見える文字列を含むファイルと一致する可能性があります。
ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
他のヒント
あなたが絶対にLSとGREPを使用する必要がある場合、これは次のとおりです。
ls -Fla | grep '^\S*x\S*'
最初の単語(非whitespace)に少なくとも1つの「x」が含まれる行と一致します。
Findはこれに最適なツールです。これにより、実行可能なすべてのファイル(-Type F)が見つかります。
find . -type f -executable
すべての実行可能ファイルを再帰的にリストしたくない場合は、maxdepthを使用してください。
find . -maxdepth 1 -type f -executable
おそらくテスト-Xで?
for f in $(\ls) ; do test -x $f && echo $f ; done
on lsはシェルエイリアスをバイパスします。
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done
これにより、実行可能ファイルへの絶対的なパスが得られます。
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'