(拡張子を含む)ファイルがたくさんあります.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とその機能が利用可能グローバル修飾子としての式次の記号が9つしかないファイルを選択してください。
$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/
>
最初の行は、9つのシンボルを含むファイルに対して真/偽のフィルタを生成することを目的とする関数を定義します。このtr
コマンドは入力(変数に期待される)に対して機能し、REPLY
a以外のすべての項目を削除して結果の文字数を計算する>
ように要求し、その出力を9と比較します。wc
2行目はコマンドを実行してmv
* .fnaファイルを(例)ディレクトリと一致させますlocation
。一致する* .fnaファイルは、私たちが定義する関数の名前で提供される式修飾子を渡す必要があります。