
私はOracle Solarisを使用しています。
使っています:
grep "searchstring" filename.*
上記のコマンドは検索結果を返します。
ここで、上記の検索結果にあるすべてのファイル (検索結果以外のすべてのファイル) を特定のディレクトリに移動したいと思います../mydir/
。
これを 1 つのコマンドで実行するにはどうすればよいですか (検索と移動の両方を 1 行のコマンドで実行する必要があります)。
答え1
ksh
、bash
またはから、ファイル名に改行文字が含まれていないと仮定すると、 (の/usr/xpg4/bin/sh
出力にsplit+glob演算子を使用して、grep -l
-l
l一致するファイルです。
この演算子は、コマンド置換(`...`
または$(...)
) 引用符なし。ここでは、$IFS
特殊変数を使用して、どの文字 (ここでは改行文字) で分割するかを指定し、 でそのglob
部分を無効にして調整しますset -f
。
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(グロビングを復元します内部)の展開に対するコマンド置換 (サブシェルで実行されます) の一部ですfilename*
。
次のように簡略化できます。
mv $(grep -l searchstring filename*) ../mydir/
ファイル名にスペース、タブ、改行、 、 文字が含まれていないことがわかっている場合。*
上記では、改行、スペース、タブ文字 ( のデフォルト値) で分割が行われ、その分割の結果の各単語に対してグロブが実行されます (ただし、ファイル名にワイルドカード文字が含まれていない場合は問題になりません)。?
[
$IFS
ファイル名に改行文字が含まれていないことを保証できない場合は、代わりにループを使用できます。
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done