Эффективный способ перемещения файлов журнала с одинаковыми именами в несколько каталогов

В перле:

#!/usr/bin/perl

use feature 'say';

while(<>) {
  chomp;                            # strip the trailing end-of-line character(s).
  my (@F) = split;                  # split the input line into fields

  $F[0] =~ s/(^[^_]*_[^_]*)_.*/$1/; # strip everything from 2nd _ from field 1
  $F[4] =~ s/^ID=[^;]*;Target=//;   # strip from ID= to Target= from field 5

  say join("\t",@F);                # print all the fields separated by a tab.
}

Если вы хотите это как один -вкладыш:

perl -lane '$F[0] =~ s/(^[^_]*_[^_]*)_.*/$1/;
            $F[4] =~ s/^ID=[^;]*;Target=//;
            print join("\t",@F);' input.txt

Опция perl -lвключает автоматическую линию -завершающую обработку (chomp ). -aвключает awk -как автоматическое разбиение поля (на массив@F). -aтакже неявно включает -n(, который автоматически создает цикл while(<>){.. }вокруг кода Perl ), но мне нравится указывать эту опцию явно. Подробности см. в man perlrun.

Обратите внимание, что массивы perl начинаются с 0, а не с 1.

Пример вывода (либо с одной подставки -, либо с одной -версии вкладыша):

SF_0000000555   10873   11041   +       SF_0000000005   99      267     168
SF_0000000555   188079  188215  +       SF_0000000020   3       138     135
SF_0000000555   137594  137704  -       SF_0000000048   16      126     110
SF_0000000555   70582   71504   -       SF_0000000350   8970    9886    916
SF_0000000555   100212  101204  -       SF_0000000350   9584    10597   1013
SF_0000000555   101165  101747  -       SF_0000000350   9005    9581    576
SF_0000000555   82434   82891   -       SF_0000000350   9273    9730    457
0
14.09.2021, 23:37
2 ответа

Создание каталогов для каждого сервера

find /var/mnt/logshare/ -maxdepth 1 -type f | cut -d' ' -f1 | sort -u |
while read server ; do
  mkdir "$server"
done

что мы делаем:

  • искать файлы (и только файлы-type f)в каталоге logshare, а не в его подкаталогах(-maxdepth 1)
  • имена серверов — это первый сегмент имени файла, -разделенный пробелом, поэтому мы cutвыводим
  • сортировать и хранить -uтолько уникальные записи
  • для каждого обращения создать каталог

Соответствующее перемещение файлов

find /var/mnt/logshare -maxdepth 1 -type d | 
while read server ; do
   mv "$server?*" "$server"
done
  • ищет каталоги в logshare и не глубже
  • имена каталогов совпадают с первой частью имен лог-файлов
  • перемещает все, что вызывается как сервер, но длиннее в каталоги
3
15.09.2021, 06:43

Попробуйте,

cd /path/to/files/ || exit
for f in *' '*; do
    mkdir -p -- "${f%% *}" &&
      mv -- "$f" "${f%% *}/"
done
1
15.09.2021, 06:46

Теги

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