Сортировка и копирование файлов

Чтение с ведущего 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).

1
16.06.2021, 07:04
1 ответ

Использование утилиты 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
1
28.07.2021, 11:31

Теги

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