переместить файлы, содержащие шаблон, определенное количество раз

переместить файлы, содержащие шаблон, определенное количество раз

У меня много файлов (с .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/

Первая строка определяет функцию, целью которой является создание фильтра true/false для файлов, содержащих девять >символов. trКоманда действует на свой ввод, ожидаемый в REPLYпеременной, удаляя все, что не является >, затем просит wcподсчитать количество полученных символов, а затем сравнивает этот вывод с 9.

Вторая строка выполняет mvкоманду для сопоставления файлов *.fna с locationкаталогом (example). Сопоставленные файлы *.fna также должны передавать квалификатор выражения, который задается как имя функции, которую мы определили.

Связанный контент