我有很多文件(带有.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 文件还必须传递表达式限定符,该限定符作为我们定义的函数的名称给出。