私はOracle Solarisを使用しています。
私は以下を使用しています:
grep "searchstring" filename.*
上記のコマンドは私の検索結果を返します。
さて、上記の検索結果のすべてのファイル(検索結果のすべてのファイルではない)を特定のディレクトリに移動したいと思います../mydir/
。
これを1つのコマンドでどのように実行できますか(検索と移動の両方を1行のコマンドで実行する必要があります)。
ベストアンサー1
ksh
、bash
または の/usr/xpg4/bin/sh
ファイル名に改行文字が含まれていないと仮定すると、grep -l
の出力に Split+glob 演算子を使用できます。-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