Как обрабатывать имена файлов пробелами?
Вопрос
Я использую Perl в Windows (Active Perl). У меня есть программа Perl для глобальных файлов в текущей папке и объединяет их все, используя команду DOS Copy, называемую изнутри System () ...
Когда я выполняю, это дает ошибку DOS, сказав, что «система не может найти указанный файл». Это связано с пробелами в именах имени файлов.
Это код Perl: -
@files = glob "*.mp3";
$outfile = 'final.mp3';
$firsttime = 1;
foreach (@files)
{
if($firsttime == 1)
{
@args = ('copy' ,"/b ","$_","+","$outfile", "$outfile");
system (@args);
#system("copy /b '$_'+$outfile $outfile");
$firsttime = 0;
}
else
{
@args = ('copy' ,"/b ","$outfile","+","$_", "$outfile");
system (@args);
#system("copy /b $outfile+'$_' $outfile");
}
}
CHOLT возвращает массив имена файлов в моей текущей папке, эти имена файлов имеют пробелы между ними, поэтому элементы массива имеют пробелы между ними. Когда я использую систему (...), чтобы выполнить мою команду копирования на этих элементах массива, используя «$ _», как показано выше, он дает ошибку, как указано выше.
Я пробовал несколько способов, в которые я мог бы назвать системой (...), но без какого-либо успеха.
Я бы хотел знать,
1] Как я могу получить эту работу над файлами, которые имеют пробелы между ними, используя код выше. Как «избежать» белого пространства в именах файлов.
2] Любое альтернативное решение в Perl для достижения того же. (Простые приветствуют ..)
Решение
Ваш код не добавляет какие-либо цитаты вокруг имена файлов.
Пытаться
"\"$_\""
и
"\"$outfile\""
Другие советы
Прекратить использование system()
Чтобы позвонить, которое можно сделать с портативной библиотекой. У Perl есть Файл :: Копия Модуль, используйте это вместо этого, и вам не нужно беспокоиться о таких вещах, как этот плюс, вы получаете гораздо лучшую портативность ОС.
system
редко правильный ответ, use Файл :: Копия;
Для объединения всех файлов:
use File::Copy;
my @in = glob "*.mp3";
my $out = "final.mp3";
open my $outh, ">", $out;
for my $file (@in) {
next if $file eq $out;
copy($file, $outh);
}
close $outh;
Проблемы могут возникнуть, когда вы пытаетесь получить доступ к переменной $_
внутри внутреннего блока. Самый безопасный способ, изменение:
foreach (@files)
к:
foreach $file (@files)
Тогда сделайте необходимые изменения на @args
, и сбежать счету, чтобы включить их в струну.
@args = ('copy' ,"/b ","\"$file\"","+","$outfile", "$outfile");
...
@args = ('copy' ,"/b ","$outfile","+","\"$file\"", "$outfile");
В Windows вы обычно можете поместить двойные цитаты вокруг имена файлов (и / или путей), позволяющие специальным символам, т.е. «Длинные имена файлов».
C: "Мой длинный путь Это файл.mp3"
Редактировать:
Это не работает?
system("copy /b \"$_\"+$outfile $outfile");
(Обратите внимание на двойные цитаты внутри строки не одинарных кавычек)
$ filename = ~ s / / /;
Что когда-либо имена файла просто использует Slash, чтобы преодолевать пробелы