1

Linuxでのスクリプト作成はかなり新しいので、これが簡単なものであることを願っています。ディレクトリに特定のテキストを含むファイルが含まれている場合、複数のファイルを含むディレクトリを別の場所に移動する必要があります。

ここに、私の基準に一致するディレクトリのリストを表示するコマンドがあります。

find . -name 'file.name' -print0 | xargs -0 grep -l "foo" | sed 's#\(.*\)/.*#\1#' | sort -u

次に、この結果を取得し、それらを実行可能スクリプト内の mv コマンドと組み合わせる必要があります。

4

3 に答える 3

3

置換を使用xargsして、目的の効果を得ることができます。

commands to get directory list | xargs -i mv "{}" <destination>
于 2013-10-17T18:05:56.160 に答える
2

投稿したパイプラインから出てくるすべてがディレクトリ名であると仮定します。

$target=/home/me/example
find . -name 'file.name' -print0 | 
xargs -0 grep -l "foo" | 
sed 's#\(.*\)/.*#\1#' | 
while read line #line is a variable with the contents of one line
do
    mv $line $target
done

ああ、ソートを取り除く -u ディレクトリを移動する必要はなく、パイプラインを「シリアル化」します。検索が完了するまでソートできないため、移動は開始されません。それがないと、移動は次のように開始できます最初のアイテムが見つかるとすぐに。

于 2013-10-17T18:02:57.387 に答える
0

バッククォート演算子は、コマンドを評価stdoutし、コマンド ラインに入力したかのように配置します。だから、あなたの場合:

mv `find . -name 'file.name' -print0 | xargs -0 grep -l "foo" | sed 's#\(.*\)/.*#\1#'` target
于 2013-10-17T18:10:03.513 に答える