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

Поместите эти функции в свой.bashrc:

parent() {
        local count
        local arg

        count=$(($1+1))
        if [ "$2" = "" ]
        then
                arg="$PWD"
        else
                arg="$2"
                if [[ $arg != /* ]]
                then
                        printf 'Warning: "%s" does not begin with "/".\n' "$arg"
                fi
        fi
        cut -d/ -f1-"$count" <<< "$arg"
}

tparent() {                                     # The ‘t’ stands for “tilde”.
        local count
        local arg
        local home

        count=$(($1+1))
        if [ "$2" = "" ]
        then
                arg="$PWD"
        else
                arg="$2"
        fi
        if [ "$3" = "" ]
        then
                home="$HOME"
        else
                home="$3"
        fi
        if [[ $home != /* ]]
        then
                printf 'Warning: "%s" does not begin with "/".\n' "$home"
        fi
        if [[ $arg/ != $home/* ]]
        then
                printf 'Error: "%s" does not begin with "%s".\n' "$arg" "$home"
                return 1
        fi
        printf '%s' "~${arg/$home}" | cut -d/ -f1-"$count"
}

Используется cut -d/ -f1-numberдля извлечения первыхNкомпонентов имени пути.numberдолжно бытьN+1 потому что нулевая строка перед первым /считается первым полем.

Использование:

$ pwd
/home/gman/stack/JW

$ parent 3
/home/gman/stack

$ tparent 1
~/stack

Это может обрабатывать пути с пробелами и символами табуляции, но не символы новой строки.

0
02.04.2020, 23:23
2 ответа

Комбинируя 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
28.04.2021, 23:18

Вы можете использовать zsh с его выражением -как -a -glob -квалификатор для выбора файлов, которые имеют только девять таких символов:

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

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

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

1
28.04.2021, 23:18

Теги

Похожие вопросы