こんにちは。私の作業コマンドは次のとおりです。
grep -l "my text" file*.ext|xargs ls -lart
このコマンドは私にとって非常に効果的です。次のように入力を減らしながら実行できるシェルファイルを作成したいと思います。
fn "my text" file*.ext
このシェルスクリプトファイルが見つかりました。
grep -l "$1" "$2"|xargs ls -lart
最初の部分でも動作しません。
grep -l "$1" "$2"
nullを返す
ベストアンサー1
スクリプトには3つ以上のパラメータが必要です。
シェルがgrep
コマンドを実行する前に
grep -l "my text" file*.ext
ファイル名ワイルドカードパターンは、file*.ext
一致するすべてのファイル名に拡張されます。したがって、最終的なコマンドラインの実行は次のようになります。
grep -l "my text" file1.ext file2.ext file3.ext
(パターンと一致するファイルの場合)
したがって、スクリプトは次のようになります。
#!/bin/sh
pattern=$1
shift
grep -l -e "$pattern" "$@" | xargs ls -lrt
ここで、パターンは変数に格納されている次のコマンドライン引数のリストから削除されます。残りの引数はファイル名のリストです(コマンドラインのファイル名ワイルドカードパターンが一致する場合)"$@"
。
二重引用符を使用してください$@
。これにより$@
、個別に引用されたコマンドライン引数のリストが展開されます。
リストに明示的なファイル名を指定する場合は不要なので、その-a
オプションを削除しました。また、パターンを指定するためにwithをls
使用します。最初の文字にダッシュ()があるパターンは混乱する可能性があるためです。grep
-e
-
grep
find
ソートでない場合は、パイピングの代わりに以下を使用することをお勧めします(スペースと改行文字を含むファイル名を正しく処理します)。
find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls
$filepattern
これは、そのコンテンツと一致する名前と、そのコンテンツと一致するコンテンツを持つファイルを検索し、同様の出力を$pattern
生成します。ls -l
検索は現在のディレクトリで繰り返し実行されます。
スクリプトの一部として:
#!/bin/sh
pattern=$1
filepattern=$2
find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls
これスクリプトは、呼び出されたときにシェルがファイル名のグローブパターンを拡張しないように呼び出す必要があります。
$ ./script.sh 'my text' 'file*.ext'