2015-06-24 3 views
0

Я пытаюсь запустить исполняемый файл perl, который копирует каталог в другое место, а затем удаляет каждый файл в этом новом месте, кроме тех, которые заканчиваются на .faa и .tsv. Вот код:sh: 1: Ошибка синтаксиса: «(« неожиданно

#!/usr/bin/perl 
use strict; 
use warnings; 

my $folder = $ARGV[0]; 

system ("cp -r ~/directoryA/$folder/ ~/directoryB/"); 
chdir "~/directoryB/$folder"; 

# Remove everything except for .faa and .tsv files 
system ("rm !\(*.faa|*.tsv\)"); 

Независимо от того, убегаю ли не круглые скобки, я получаю ошибку:.

sh: 1: Syntax error: "(" unexpected 

и не удалит файлы, расположение файла PERL составляет ~/bin, и я хотел бы избежать изменения строки #!/usr/bin/perl, поскольку несколько компьютеров будут использовать этот скрипт. Это немного больше, чем я знаю, поскольку я знаю только основные сценарии, но кто-нибудь знает, почему это происходит?

+1

Всегда интересно, почему кто-то завернуть 3 строки сценария оболочки в 8 строк Perl, без каких-либо функциональных возможностей плюс ... – jm666

+0

Для запуска, я типа: perlfile.pl папку perfile.pl находится в папке bin, которую я сделал. – tkidder

+2

Сам код Perl является синтаксически правильным. Сообщение об ошибке синтаксиса выводится из оболочки, вызываемой вторым вызовом 'system'. Строка, передаваемая оболочке в виде команды, является '' rm! (*. Faa | * .tsv) ". Что вы ожидали от оболочки? Команда 'rm' не распознает'! 'Или круглые скобки как специальные символы. –

ответ

1

Он жалуется этой линии:

system ("rm !\(*.faa|*.tsv\)"); 

, так как даже если вы получите цитирование метасимволов правых, является довольно тупым и не, я считаю, стереть все файлы, которые не заканчиваются в .faa или .tsv.

Perl соответствует последней задаче.

unlink grep { -f $_ && !/[.]faa$/ && !/[.]tsv$/ } glob("*") 

является одним из нескольких способов.

2

Вся эта программа намного проще без использования оболочки команд

Я пишу это, который копирует только разыскиваемые типы файлов в первую очередь. Я предполагаю, что нет вложенных каталогов, которые будут копироваться

use strict; 
use warnings; 

use File::Copy 'copy'; 

my ($folder) = @ARGV; 

while (my $file = glob "~/directoryA/$folder/*.{faa,tsv}") { 
    copy $file, '~/directoryB'; 
}