web-dev-qa-db-ja.com

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を使用するより良い解決策がありますか?

ls -laによって生成される行の最初の10文字に少なくとも1つのxが含まれるファイルのみをgrepしたい

28
k13n

Lsを使用する必要がありますか? findを使用して同じことを行うことができます。

find . -maxdepth 1 -perm -111 -type f

現在のディレクトリにあるすべての実行可能ファイルを返します。 -maxdepthフラグを削除して、すべての子ディレクトリを走査します。

この恐ろしさを試すこともできますが、許可のように見える文字列を含むファイルと一致する可能性があります。

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
48
Dan

Lsとgrepを絶対に使用する必要がある場合、これは機能します。

ls -Fla | grep '^\S*x\S*'

最初のWord(空白以外)に少なくとも1つの「x」が含まれる行に一致します。

Findはこれに最適なツールです。これにより、実行可能なすべてのファイル(-type f)が検索されます。

find . -type f -executable

すべての実行可能ファイルを再帰的に一覧表示したくない場合は、maxdepthを使用します。

find . -maxdepth 1 -type f -executable
40
rmmh

おそらくテスト-xで?

for f in $(\ls) ; do test -x $f && echo $f ; done

Lsの\は、シェルエイリアスをバイパスします。

7
David Poole
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done

これにより、実行可能ファイルへの絶対パスが提供されます。

5
user842679