たくさんのファイル(拡張子付き)があります.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 ファイルには、定義した関数の名前として指定される式修飾子も渡す必要があります。