Perl. При перезаписи файла возникают дубли на UNIX SunOS

Perl. При перезаписи файла возникают дубли на UNIX SunOS

19.09.2017 11:46:48 Просмотров 15 Источник

Сделал скрипт на Perl. Смысл его в том, чтобы перезаписывать значения в файлах (работа со списком) Проверил на Win - работа корректная, на UNIX создаются дубли с одинаковым названием файла:

-bash-3.00$ ls -la
total 13210122
drwxr-xr-x+  2 adm       4096 Sep 19 10:58 .
drwxr-xr-x+  5 adm         96 Sep 19 11:10 ..
-rw-r--r--+  1 adm    180143028 Sep 18 11:11 CMExport_BEL_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+  1 adm    180136758 Sep 19 10:44 CMExport_BEL_RNC_0.0.0.0_2017091806.xml

-rw-r--r--+  1 adm    155967287 Sep 18 11:15 CMExport_BRN_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+  1 adm    155961633 Sep 19 10:45 CMExport_BRN_RNC_0.0.0.0_2017091806.xml

-rw-r--r--+  1 adm    162663698 Sep 18 11:06 CMExport_IVN_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+  1 adm    162658484 Sep 19 10:45 CMExport_IVN_RNC_0.0.0.0_2017091806.xml

-rw-r--r--+  1 adm    76585106 Sep 18 11:12 CMExport_KLG_RNC_0.0.0.0_2017091806.xml
-rw-r--r--+  1 adm    76582356 Sep 19 10:46 CMExport_KLG_RNC_0.0.0.0_2017091806.xml

Причем в первом случае это 'документ XML' а во втором 'файл XML'

Подскажите пожалуйста как вылечить?

OC - SunOS oss-adapters-collector 5.10 Generic_142900-11 sun4v sparc SUNW,T5440

Пример кода:

use warnings;
use strict;
use diagnostics;
use POSIX 'strftime';

my $dateprev = strftime '%Y%m%d',localtime(time-172800);

my @file = `ls -a /directory/$dateprev`;

shift @file;
shift @file;

for(my $i=0; $i<@file; $i++)
{
    my $filename = "/directory/$dateprev/$file[$i]";
    open(SESAME, $filename)  or die "I can not open '$filename' $!";
    my @data = <SESAME>;
    close(SESAME);
my $what = '&lt;NULL&gt;';
my $then = ' ';
foreach ( @data ) {
    s{\Q$what\E}{$then};
}
#Записываем в файл массив
open(my $fh, '>', $filename) or die "I can not open '$filename' $!";
foreach (@data)
{
    print $fh "$_"; # Print each entry in our array to the file
}
close $fh;
}
У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos#comment1084541_720268
прям так файлы с одинаковым именем в одном каталоге? или там три точки в конце имени не случайны?
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos#comment1084542_720268
Да прям одинаковые, три точки означают, что таких файлов много. Отличия только в размере.
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos#comment1084546_720268
маловероятно, что в одном каталоге будут файлы с одинаковым именем. Может там регистр разный. Показывайте лучше список файлов, как их ls -al показывает.
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos#comment1084557_720268
Добавил ls -la в тему
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos#comment1084561_720268
не нужно вывод терминала показывать как картинку. Плюс, скрывать пол имени. Это выглядит как издевательство.
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos#comment1084570_720268
Не вопрос, могу в любом виде показать

Ответы - Perl. При перезаписи файла возникают дубли на UNIX SunOS / Perl. При перезаписи файла возникают дубли на UNIX SunOS

KoVadim

19.09.2017 12:45:41

Хотя список файлов и был подредактирован, но ошибку нашел.

Вся проблема заключается в том, что используется

my @file = `ls -a /directory/$dateprev`;

элементарный вывод Dumper(@file) сразу бы показал, что там есть переводы строк в конце. Поэтому, имена файлов все таки различны. Это кстати, и вывод ls показал, делая сам вывод немного "необычным". Почему под виндой оно отработало нормально - не знаю. Может драйвер файловой системы сам все пофиксил.

Как исправить. Можно по старинке, имена файлов обработать chop/chomp или регуляркой вида `s/\n$//g/.

А можно вместо строки

my @file = `ls -a /directory/$dateprev`;

написать так

my @file = glob("/directory/$dateprev/*");

В этом случае имена будут с путями, что немного упростит дальнейший код.

https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos/720297#comment1084590_720297
Спасибо, за ответ. Я уже разобрался в чем причина =), а именно в том что в конец файла записывается перевод каретки, и нужно применить: chomp $file[$i]; в цикле FOR.
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos/720297#comment1084591_720297
@AndreyIvanov А я бы вообще предложил этот массив с именами файлов убрать. а делать цикл while(</directory/$dateprev/*>) вместо for
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos/720297#comment1084596_720297
@Mike Я не очень сильно знаком с PL, в вашем случае while(</directory/$dateprev/*>) будет перебирать все файлы?
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos/720297#comment1084600_720297
конечно будет. Но только в perl, а не PL.
https://ru.stackoverflow.com/questions/720268/perl-%d0%9f%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2%d0%be%d0%b7%d0%bd%d0%b8%d0%ba%d0%b0%d1%8e%d1%82-%d0%b4%d1%83%d0%b1%d0%bb%d0%b8-%d0%bd%d0%b0-unix-sunos/720297#comment1084601_720297
@AndreyIvanov Да, внутри цикла, в данном случае в $_ будут находится имена файлов. можете для теста выполнить такой цикл поставив внутрь print, увидите в каком они виде.
Является ответом!
Andrey Ivanov

19.09.2017 12:49:41

разобрался в чем причина, а именно в том что в конец файла записывается перевод каретки, и нужно применить:

 chomp $file[$i];

в цикле FOR.

Закрыть X