В linux: cp: отсутствующий операнд файла назначения после исходного файла

Вопрос: Ниже код является частью скрипта, в котором я объединять файлы разных каталогов. После слияния я копирую оставшиеся файлы в конечный каталог. Слияние работает нормально, но при копировании файлов я получаю cp: missing destination file operand after '/users/abc/perl_scripts/temp_dir/b.cc' Try 'cp --help' for more information. sh: line 1: /users/abc/perl_scripts/temp: is a directory for $k(dir1) { $flag=0;

Вопрос:

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

cp: missing destination file operand after ‘/users/abc/perl_scripts/temp_dir/b.cc’ Try ‘cp —help’ for more information. sh: line 1: /users/abc/perl_scripts/temp: is a directory for $k(dir1) { $flag=0; for $j(@dir2) { if(«$k» eq «$j») { &merge_gcov(«$UERRC1/$k»,»$UERRC2/$k»,»$DATA_DIR/$k»); $flag=1; last; } } if($flag == 0) { #print «>>>>>>>>>>>>> cp $UERRC1/$k $DATA_DIR/$k n»; ‘cp $UERRC1/$k,$DATA_DIR’; } }

Может ли кто-нибудь помочь мне разрешить это…

Лучший ответ:

Всякий раз, когда вы используете системные вызовы, вы, скорее всего, делаете что-то избыточное, и в этом случае оно явно избыточно. Perl очень способен копировать файлы. Я рекомендую модуль File::Copy, который является основным модулем в perl 5. Используя его просто:

use File::Copy qw(copy); copy $from, $to or die $!; # it is a good idea to check if the copy failed

Кроме того, вместо того, чтобы перебирать все имена файлов в @dir2 и видеть, совпадает ли имя с именем в $k, почему бы просто не проверить, существует ли файл в другом каталоге? Например

if (-e «$UERRC1/$k») { # check if file exists merge_gcov(«$UERRC1/$k», «$UERRC2/$k», «$DATA_DIR/$k»); } else { copy «$UERRC1/$k», $DATA_DIR or die $!; }

Документация для теста файла -e находится в perldoc -f «-X»

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

Также…

Прежде чем делать что-либо еще, вы должны добавить в свой скрипт следующие две строки и исправить ошибки, которые, несомненно, появятся:

use strict; use warnings;

strict заставит вас объявить все переменные (как правило, с my $foo), который будет удален с целью обнаружения ошибок из-за опечаток в именах переменных. Сообщение об ошибке будет читать “Глобальный символ $ foo требует явного имени пакета…”.

warnings дадут вам информацию о том, что вы делаете неправильно. Это хорошая вещь.

Ответ №1

Аргументы cp имеют вид cp from to, но у вас есть cp from,to.

Возможно, поэтому он жалуется на количество аргументов – $UERRC1/$k,$DATA_DIR – единственный аргумент. Он должен быть cp $UERRC1/$k $DATA_DIR, как в вашем заявлении на печать.

Оцените статью
Добавить комментарий