2017-02-04 9 views
0

Мне нужно переместить с помощью Perl содержимое каталога Windows, содержащего скобки в его имени, в другую папку, проблема в том, что он всегда терпит неудачу из-за скобки ,perl: using File :: Copy move() в каталогах Windows, содержащих круглые скобки

Я попытался с помощью либо Glob или opendir + READDIR функции, но я всегда получаю ошибки, например:

#!/usr/bin/perl 
use File::Copy; 

$src = "c:\\temp (1)J"; 
for $f (glob("$src\*")) { 
    move($f, "\out"); 
} 

Это не удается, так как этот:

#!/usr/bin/perl 
use File::Copy; 

$src = "c:\temp (1)"; 
opendir DIR, $src; 
while ($f = readdir(DIR)) { 
    move("$src\$f", "\out"); 
} 

Любые идеи о том, как решить эту проблему?

+1

На самом деле это пространство, которое является особым символом шара, а не parens. Вам нужно избежать этого. – ikegami

+0

Во втором примере у вас есть 'c: ...' вместо 'c: \ ...' – ikegami

ответ

1

Скобки в именах не должны создавать проблемы. (Если строка не оценивается в выражениях, где они имеют значение.) Спасибо за комментарий ikegami, отправив меня обратно на тестирование.

Однако пространство проблема с glob и нужно экранировать

my $src = 'c:\temp\ (1)J'; 

foreach my $f (glob "$src/*") { 
    move $f, "\out"; 
} 

Обратите внимание, что glob возвращает файл с пути, так что вам не нужно (и не хотят), чтобы добавить путь. Также обратите внимание, что нам нужен одинарные кавычки, когда $src присвоен, или q().

Проблема заключается в том, что с $dir = 'dir A' после "$dir"glob имеет dir A, которые он интерпретирует как каталоги dir и A (то же самое относится и к файлам). Таким образом, вы должны каким-то образом избегать пробелов или дублировать, glob qq{"$src/*"}, где внешние кавычки вытягивают все слова в одну строку.

Лучше использовать File::Glob в отношении пространств, которые не имеют этой проблемы

: bsd_glob
В :bsd_glob экспорта экспорта тегов bsd_glob() и константы, перечисленные ниже. Он также переопределяет glob() в вызывающем пакете с тем, который ведет себя как bsd_glob() относительно пробелов (пространство рассматривается как часть имени файла), но поддерживает итерацию в скалярном контексте; то есть он сохраняет функцию основной функции при возврате следующего элемента каждый раз, когда он вызывается.

Однако не забудьте увидеть NOTES об использовании (обратной) косой черты в Windows. Отрывок

  • В системах DOSISH, обратный слэш является допустимым символом разделителя каталогов.
    ...
  • Пользователи Win32 должны использовать реальную косую черту.Если вы действительно хотите использовать обратную косую черту, рассмотреть вопрос об использовании Sarathy-х File::DosGlob, который поставляется со стандартным распределением Perl

С File::DosGlob вы снова должны избежать пробелов.