Чтение с ведущего pty будет отправлено на тот же n_tty_read()
, то есть к ведущему прикрепляется та же N_TTY
линейная дисциплина, что и к ведомому pty.
Вся трассировка системного вызова read выглядит примерно так:
sys_read() -> ksys_read() -> vfs_read() -> __vfs_read()
-> file->f_op->read = tty_fops.read -> tty_read()
-> ld->ops->read = n_tty_ops.read -> n_tty_read()
, а линейная дисциплина прикрепляется к мастеру через
ptmx_open()
-> tty_init_dev()
-> alloc_tty_struct()
-> tty_ldisc_init()
-> tty_ldisc_get(tty, N_TTY)
Ситуация может быть запутана тем фактом, что
a)Конфигурация termios, используемая мастером pty, настроена на raw/passthrough, поэтому может показаться, что линейная дисциплина вообще отсутствует;-)(см. ptm_driver->init_termios...
инициализации вunix98_pty_init()
).
b)все termios ioctl(tcsetattr() -> ioctl(TCSETS)
и т. д. )будут действовать на конфигурацию ведомого termios даже при вызове на ведущем pty (см.tty_mode_ioctl()
вdrivers/tty/tty_ioctl.c
).
Использование утилиты perlrename
(, также известной как prename
, file-rename
, perl-rename
в некоторых дистрибутивах Linux):
rename -n 'if (m/^(\w{1,2}?)(\d{2,}_.*)/) {mkdir $1; $_ = "$1/$1$2"}' *
ПРИМЕЧАНИЕ. :это работает ТОЛЬКО с утилитой переименования на основе perl -. Вы можете проверить, установлен ли он у вас, запустив rename -V
(, prename -V
, file-rename -V
или perl-rename -V
). Если там упоминается perl или File::Rename
, то это Perl-версия rename
. В противном случае, это, вероятно, rename
из util-linux
, который имеет совершенно разные и несовместимые функции и опции командной -строки. Это НЕ будет работать с утилитой -linux rename (или любой другой версией переименования -для этого требуется perl rename)
При этом используются первые один или два символа «слово» (не -жадное совпадение )каждого совпадающего имени файла в качестве каталога, затем создается каталог и переименовывается файл в каталог. Символ «слово»(\w
)определен в man perlre
как:
"Match a "word" character (alphanumeric plus "_", plus other connector punctuation chars plus Unicode marks)"
Если это не совсем то, что вам нужно, вы можете уточнить шаблон, используя, например,. [[:alpha:]]{1,2}?
вместо \w{1,2}?
для любых буквенных символов или [[:upper:]]{1,2}
для символов только верхнего -регистра.
\d
соответствует только цифрам. Если вы хотите разрешить любые словесные символы перед символом подчеркивания, используйте \w
. Или используйте [[:alnum:]]
, если вы хотите разрешить только буквенные и цифровые символы.
Имена файлов, которые не соответствуют полному шаблону (1 -или -2 символа «слово», за которыми следуют как минимум две цифры, за которыми следует символ подчеркивания ), не затрагиваются.
Обратите внимание, :опция -n
делает эту операцию пробной -. Он только покажет, что он сделал бы , не делая этого на самом деле. Как только вы убедитесь, что он делает то, что вы хотите, удалите-n
(или замените его на -v
для подробного вывода ).
напр.учитывая следующий сценарий установки:
#!/bin/bash
for i in A AA Z9 ZZ ; do
for j in {01..10} ; do
touch "$i${j}_.txt"
done
done
# anomaly
touch A1001_.txt
$./setup.sh
$ ls
A01_.txt A02_.txt A03_.txt A04_.txt A05_.txt A06_.txt A07_.txt A08_.txt
A09_.txt A1001_.txt A10_.txt AA01_.txt AA02_.txt AA03_.txt AA04_.txt AA05_.txt
AA06_.txt AA07_.txt AA08_.txt AA09_.txt AA10_.txt setup.sh* Z901_.txt
Z902_.txt Z903_.txt Z904_.txt Z905_.txt Z906_.txt Z907_.txt Z908_.txt
Z909_.txt Z910_.txt ZZ01_.txt ZZ02_.txt ZZ03_.txt ZZ04_.txt ZZ05_.txt
ZZ06_.txt ZZ07_.txt ZZ08_.txt ZZ09_.txt ZZ10_.txt
После запуска perl-скрипта переименования:
$ rename 'if (m/^(\w{1,2}?)(\d{2,}_.*)/) {mkdir $1; $_ = "$1/$1$2"}' *
$ ls */*
A/A01_.txt A/A02_.txt A/A03_.txt A/A04_.txt A/A05_.txt A/A06_.txt
A/A07_.txt A/A08_.txt A/A09_.txt A/A1001_.txt A/A10_.txt AA/AA01_.txt
AA/AA02_.txt AA/AA03_.txt AA/AA04_.txt AA/AA05_.txt AA/AA06_.txt
AA/AA07_.txt AA/AA08_.txt AA/AA09_.txt AA/AA10_.txt Z/Z901_.txt
Z/Z902_.txt Z/Z903_.txt Z/Z904_.txt Z/Z905_.txt Z/Z906_.txt Z/Z907_.txt
Z/Z908_.txt Z/Z909_.txt Z/Z910_.txt ZZ/ZZ01_.txt ZZ/ZZ02_.txt ZZ/ZZ03_.txt
ZZ/ZZ04_.txt ZZ/ZZ05_.txt ZZ/ZZ06_.txt ZZ/ZZ07_.txt ZZ/ZZ08_.txt
ZZ/ZZ09_.txt ZZ/ZZ10_.txt