Как я могу скопировать файл и создать целевые каталоги одновременно?

[abcde]{3} соответствия три последовательных символа в наборе abcde. Таким образом, Вы ищете строки, содержащие один, три, пять или семь последовательных символов в том вашем наборе, который эквивалентен поиску строк с тем из этих символов.

Для поиска греческих букв первый шаг должен иметь греческие буквы соответствия шаблона, не латинские буквы. Для поиска строк, содержащих по крайней мере 13 греческих букв, ищите 13 случаев шаблона “греческая буква, сопровождаемая некоторым другим материалом”. Вот шаблон, который ищет строчные неукрашенные греческие буквы только:

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}'

Если Вы хотите строки, содержащие точно 13 строчных неукрашенных греческих букв (плюс некоторый другой материал, который не является luGl), отфильтруйте результаты для устранения строк, содержащих 14 luGl.

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}' |
grep -v -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){14}'

Если Вы хотите строки, содержащие точно 13 luGl и никакой другой символ:

<greek.txt grep -x -E '[αβγδεζηθικλμνξοπρςστυφχψω]{13}'

Теперь, если Вы хотите четное число согласных, ищете строки, состоящие из “чего-то, что не содержит согласного, сопровождаемого четным числом (согласный, сопровождаемый чем-то, что не содержит согласного)”. Для нечетного числа добавьте другое возникновение того последнего подшаблона.

cons="βγδζθκλμνξπρςστφχψω"
<greek.txt grep -E "^[^$cons]*([$cons][^$cons]*[$cons][^$cons]*)*[$cons][^$cons]"

В Perl можно соответствовать греческой букве шаблону \p{Greek}, и строчная буква в любом алфавите с шаблоном \p{Ll}. Для поиска строчной греческой буквы искать (?=\p{Ll})\p{Greek}. Необходимо запустить скрипт под семантикой Unicode; самый легкий способ сделать это должно выполнить его с -C опция. () = m/REGEXP/g идиома Perl должна считать количество соответствий.

<greek.txt perl -C -l -ne 'print if (() = m/(?:(?=\p{Ll})\p{Greek})/g) == 13'

Нет никакого встроенного способа соответствовать греческим гласным, таким образом, решение для Perl второй части Вашей проблемы должно будет соответствовать им явно.

20
28.02.2019, 03:48
5 ответов

Попытайтесь использовать такую следующую функцию для такой ситуации:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

и используйте его как

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

Между прочим, GNU cp имеет a --parents опция. Это действительно близко к тому, что Вы хотите, но не точно.
Это также создаст aaa для каталога, который кажется Вами, не нужно. Однако Вы можете первый CD к aaa и копия как:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/
19
27.01.2020, 19:43
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Если Вы не имеете pax (это получает мандат POSIX, как стандартная замена cpio и tar, который имел слишком много несовместимостей для стандартизации), использовать cpio -p или tar -cf - … | tar -xf - вместо этого.

4
27.01.2020, 19:43

Я не знаю, как это сделать с помощью cp, но это, конечно, возможно с помощью rsync:

$ rsync sourcefile dir/

, где dir - это каталог, который не должен существовать. Есть много других способов достичь того же самого, используя другие команды.

.
5
27.01.2020, 19:43

Легко использовать программу install из coreutils, которая обычно используется именно для этой цели при сборке систем типа automake:

install -D /path/to/source /path/to/destination

Обратите внимание, что install создает все части пути так же, как это делает mkdir -p, смотрите man install. Мне любопытно, почему вы не включили почему вы хотите это сделать. Позвонить mkdir и cp очень просто.

.
24
27.01.2020, 19:43

С помощью стандартных (POSIX/Unix) команд вы получаете:

pax -rws ':^:dest/dir/:' file .
6
27.01.2020, 19:43

Теги

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