0

たとえば、文字列「J34567」を含むフォルダー内のすべてのファイルを検索して処理するスクリプトを作成しようとしています。現在、コードを使用してフォルダー内のすべてのファイルを処理できますが、スクリプトは含まれている文字列を処理するだけでなく、フォルダー内のすべてのファイルを処理します。つまり、文字列名を使用してスクリプトを実行すると、その文字列名 ./bashexample 'J37264'がなくてもすべてのファイルが処理されます。以下は私のコードです:

#!/bin/bash

directory=$(cd `dirname .` && pwd)
tag=$1

echo find: $tag on $directory

find $directory . -type f -exec grep -sl "$tag"  {} \;

for files in $directory/*$tag*
do
    for i in *.std
    do
    /projects/OPSLIB/BCMTOOLS/sumfmt_linux < $i > $i.sum
    done

    for j in *.txt
    do
    egrep "device|Device|\(F\)" $i > $i.fail
    done
    echo $files
done
4

3 に答える 3

0

次のスクリプトは、指定されたパターンを (ファイル名ではなくファイル内に) 含むファイルのリストを提供します。

#!/bin/bash

directory=`pwd`
tag=$1

for file in $(find "$directory" -type f -exec grep -l "$tag" {} \;); do
    echo $file
    # use $file for further operations
done

.std、.txt、.sum、および .fail ファイルと特定のパターンを含むファイルとの関連性は?

ファイル名に特殊文字、スペースなどが含まれていないことを前提としています。
その場合、以下はそれらの回避に役立つはずです。
bashループリストで空白をエスケープするにはどうすればよいですか?
find の出力をキャプチャします。-print0 を bash 配列に


スクリプトには複数の問題があります。

運用ディレクトリをカレントディレクトリに設定する場合、以下は不要です。

directory=$(cd `dirname .` && pwd)

$directoryとにより、現在のディレクトリに対して find が 2 回実行され.ます。

find $directory . -type f -exec grep -sl "$tag"  {} \;

また、上記のfindの結果/出力はforループでは使用されません。
for ループは、ファイル名が指定されたパターンを持つ$directory(サブディレクトリは考慮されません)内のファイルに対して実行されます。

for files in $directory/*$tag*

$i次の for ループは、現在のディレクトリ内のすべての .txt ファイルに対して実行されますが、前のループからの使用により、出力ファイルは 1 つだけになります。

for j in *.txt
do
    egrep "device|Device|\(F\)" $i > $i.fail
done
于 2013-08-14T21:45:15.177 に答える