パターンを特定回数含むファイルを移動する

パターンを特定回数含むファイルを移動する

たくさんのファイル(拡張子付き)があります.fna。文字が含まれている場合は移動する必要があります。>一定回数。

どのファイルが含まれているか知っています>このコマンドを一定回数(この例では 9 回)実行します。

grep -c ">" *.fna | grep ":9"

次のような出力が得られます

5242_ref.fna:9
9418_ref.fna:9

しかし、それらのファイルを別のフォルダに移動する方法がわかりません。

ありがとう。

答え1

egrep-l正の一致がファイル名のみを返すようにオプションで呼び出される)と組み合わせることでxargsテキストの一致に基づいて任意のコマンドを実行できます。

[gnubeard@mothership: ~/mver]$ ls
destination  example.fna  non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>>>>>>>>
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ egrep -l '>{9}' *.fna | xargs -I{} mv {} destination/
[gnubeard@mothership: ~/mver]$ ls
destination  non_example.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna

編集: 文字が他の文字または改行で区切られている場合、これは、文字のインスタンスが一定数あるファイルには一致しません。希望どおりに動作するこの短いスクリプトを作成しました。

#! /usr/bin/env bash

DESTINATION=./destination
MATCH_CHAR='>'
MATCH_COUNT=9

for FILE in $1; do
  MATCHES=$(grep -o $MATCH_CHAR $FILE | wc -l)
  if [ $MATCHES -eq $MATCH_COUNT ]; then
    mv $FILE $DESTINATION
  fi
done

例:

[gnubeard@mothership: ~/mver]$ ls
destination  example.fna  mver  non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>
>>foo>>bar>>>baz
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ ./mver *.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna
[gnubeard@mothership: ~/mver]$ ls
destination  mver  non_example.fna

答え2

zshをglob 修飾子としての式このようなシンボルが 9 個だけ含まれるファイルを選択するには:

$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/

>最初の行は、9 個のシンボルを含むファイルに対して true/false フィルターを作成するための関数を定義します。このtrコマンドは、変数に期待される入力に基づいて動作しREPLY、 以外のものをすべて削除し>wc結果として得られる文字の数を数えて、その出力を 9 と比較します。

2 行目は、mv(example)locationディレクトリに一致する *.fna ファイルのコマンドを実行します。一致する *.fna ファイルには、定義した関数の名前として指定される式修飾子も渡す必要があります。

関連情報