Как я могу скопировать файлы со специальными символами в их именах с помощью Perl's File :: Copy? - PullRequest
3 голосов
/ 21 сентября 2010

Я пытаюсь скопировать все файлы в одном месте в другое место и использую модуль File::Copy и команду copy из этого, но теперь проблема, с которой я сталкиваюсь, заключается в том, что у меня есть файл, имя которого имеет special character у которого значение ascii &#253, но в файловой системе unix оно хранится как ?, и поэтому мой вопрос заключается в том, что copy or move command будет рассматривать эти файлы со специальными символами при копировании или перемещении в другое место или нет, если сейчас, то чтобыло бы возможным обойти это?

Примечание: Я не могу создать файл со специальными символами в Unix, потому что специальные символы заменены на ?, и я не могу сделать это в Windows, потому что наСпециальные символы Windows заменяются на кодированное значение, как в моем случае &#253?

my $folderpath = 'the_path';
open my $IN, '<', 'path/to/infile';
my $total;
while (<$IN>) {
    chomp;
    my $size = -s "$folderpath/$_";
    print "$_ => $size\n";
    $total += $size;
}
print "Total => $total\n";

Предоставлено: RickF Ответ

Любойпредложение будет высоко ценится.

Справочный вопрос : Вопрос обработки Perl-файлов

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

Как Обходной путь Я могу предложить преобразовать все неподдерживаемые символы в поддерживаемые.Это можно сделать разными способами.Например, вы можете использовать URI::Escape:

use URI::Escape;
my $new_file_name = uri_escape($weird_file_name);

Обновление:

Вот как я смог скопировать файл по имени uft-8.Я на винде.Я использовал Win32::GetANSIPathName, чтобы получить короткое имя файла.Затем это было скопировано хорошо:

use File::Copy;
use URI::Escape;
use Win32;

use utf8; ## tell perl that source code is in utf-9
use strict;
use warnings;

my $test_file = "IBMýSoftware.txt";
my $from_file = Win32::GetANSIPathName($test_file); ## get "short" name of file
my $to_file   = uri_escape($test_file); ## name with special characters escaped

printf("copy [%s] -> [%s]\n", $from_file, $to_file);
copy($from_file, $to_file);

После копирования всех файлов в новые имена в Windows, вы сможете работать с ними в Linux без проблем.

Вот несколько советов оОткрытие файла utf-8:

3 голосов
/ 21 сентября 2010

Символ 253 равен ý. Я предполагаю, что в вашей системе Unix языковой стандарт не установлен, или действует только самый примитивный резервный языковой стандарт, и поэтому вы видите заменяющий символ. Если я правильно угадываю, решение состоит в том, чтобы просто установить язык на что-то, предпочтительно на язык UTF-8, так как он может обрабатывать все символы, и Perl даже не должен вступать в проблему.

> cat 3761218.pl
use utf8;
use strict;
use warnings FATAL => 'all';
use autodie qw(:all);

my $file_name = '63551_106640_63551 IBMýSoftware Delivery&Fulfillment(Div-61) Data IPS 08-20-2010 v3.xlsm';
open my $h, '>', $file_name;

> perl 3761218.pl
> ls 6*
63551_106640_63551 IBMýSoftware Delivery&Fulfillment(Div-61) Data IPS 08-20-2010 v3.xlsm
> LANG=C ls 6* # temporarily cripple locale so that the problem in the question is exhibited
63551_106640_63551 IBM??Software Delivery&Fulfillment(Div-61) Data IPS 08-20-2010 v3.xlsm
> locale | head -1 # show which locale I have set
LANG=de_DE.UTF-8
0 голосов
/ 21 сентября 2010

Следующий скрипт работает как положено для меня:

#!/usr/bin/perl

use strict; use warnings;
use autodie;

use File::Copy qw( copy );
use File::Spec::Functions qw( catfile );

my $fname = chr 0xfd;

open my $out, '>', catfile($ENV{TEMP}, $fname);
close $out;

copy catfile($ENV{TEMP}, $fname) => catfile($ENV{HOME}, $fname);
...