将包含模式的文件移动一定次数

将包含模式的文件移动一定次数

我有很多文件(带有.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 及其表达式作为全局限定符选择只有九个这样的符号的文件:

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

第一行定义了一个函数,其目的是为包含九个>符号的文件创建真/假过滤器。该tr命令对其输入进行操作(预期在变量中)REPLY,删除所有不是 a 的内容>,然后要求wc计算结果字符的数量,然后将该输出与 9 进行比较。

第二行执行mv将 *.fna 文件匹配到(示例)location目录的命令。匹配 *.fna 文件还必须传递表达式限定符,该限定符作为我们定义的函数的名称给出。

相关内容