Поместите эти функции в свой.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
Это может обрабатывать пути с пробелами и символами табуляции, но не символы новой строки.
Комбинируя 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
Вы можете использовать zsh с его выражением -как -a -glob -квалификатор для выбора файлов, которые имеют только девять таких символов:
$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/
Первая строка определяет функцию, целью которой является создание фильтра истинного/ложного для файлов, содержащих девять >
символов. Команда tr
воздействует на свой ввод, ожидаемый в переменной REPLY
, удаляя все, что не является >
, затем просит wc
подсчитать количество результирующих символов, а затем сравнивает этот вывод с 9.
Во второй строке выполняется команда mv
для сопоставления файлов *.fna с каталогом (example )location
. Соответствующие *файлы.fna также должны передавать квалификатор выражения, который задается как имя определенной нами функции.