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

$ perl -e '
   open(F1,"<",shift);
   open(F2,"<",shift);
   while(<F1>) {
     chomp; # strip trailing \n from input file.
     $new=<F2>;
     chomp $new;
     print "s/$_/$new/g\n"
   }' file1.txt file2.txt
s/360002ac000000000000001f20001add7/60002ac000000000000001f20001accb/g
s/360002ac000000000000001f20001add8/60002ac000000000000001f20001accc/g
s/360002ac000000000000001f20001add9/60002ac000000000000001f20001accd/g
s/360002ac000000000000001f20001ade0/60002ac000000000000001f20001acce/g

Это могло быть (и было написано как )в один -лайнер, я добавил перевод строки, чтобы сделать его более читаемым.

Если file1.txtне имеет того же количества строк, что и file2.txt, этот скрипт выдаст ложный вывод для любых строк в одном файле, которым нет соответствующей строки в другом. Так что не делай этого.

Чтобы применить эти изменения к вашему multipath.confфайлу, запустите приведенный выше лайнер perl one -и перенаправьте вывод в файл (, например. sedscript.sed), а затем запустите:

sed -f sedscript.sed multipath.conf

Убедитесь, что сгенерированный sedскрипт делает то, что вы хотите, а затем либо перенаправьте вывод в новый файл, либо используйте параметр sed-iдля редактирования «в -месте» multipath.conf. Конечно, сначала сделайте резервную копию и скопируйте ее в безопасное место вне досягаемости-i(или даже-i.bak).

примеры входных файлов::

$ cat file1.txt 
360002ac000000000000001f20001add7
360002ac000000000000001f20001add8
360002ac000000000000001f20001add9
360002ac000000000000001f20001ade0

$ cat file2.txt 
60002ac000000000000001f20001accb
60002ac000000000000001f20001accc
60002ac000000000000001f20001accd
60002ac000000000000001f20001acce

Кстати, приложив немного больше усилий, этот лайнер perl one -можно было бы заставить читать в файле1 и файле2, создавать массив операций s/old/new/g, а затем применять их к третьему файлу (, например multipath.conf)

Например:

#!/usr/bin/perl

# run with three arguments:
# $1 = file containing old patterns
# $2 = file containing replacements
# $3 = file to modify

# THIS SCRIPT IS A CRUDE, MINIMALIST EXAMPLE AND CONTAINS NO ERROR
# CHECKING/HANDLING CODE AT ALL. USE AT OWN RISK.

use strict;
use File::Slurp;

# hash to store the search patterns and their replacements.
my %regex=();

open(F1,"<",shift);
open(F2,"<",shift);
while(<F1>) {
  chomp; # strip trailing \n from input file.
  my $new=<F2>;
  chomp $new;
  # qr// pre-compiles the regular expression, so it doesn't have to be
  # compiled on every pass through the loop.
  $regex{qr/$_/} = $new;
};
close(F1);
close(F2);

my $f3=shift;

my @file3=read_file($f3);

# transform and overwrite the third file.
open(F3,">",$f3);
foreach (@file3) {
  foreach my $key (keys %regex) {
        s/$key/$regex{$key}/g;
  }
  print F3;
};
close(F3);
1
19.10.2021, 14:07
1 ответ

Попробуйте это:

rsync -rzP --include="*some_file.gz" --include="*/" --exclude="*" user@domain:/mnt/file_direction /mnt/Downloads/Files
1
19.10.2021, 15:07

Теги

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