Если cp запускается в perl-скрипте, будут ли перезаписаны существующие файлы? - PullRequest
2 голосов
/ 28 июля 2011

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

system ("rm -rf /home/alos/Y2H_images/all$intensity");
system ("cp $intensity /home/alos/Y2H_images/all");

Или выполнение команды копирования в сценарии perl автоматически перезапишет файл?Спасибо

Ответы [ 4 ]

4 голосов
/ 28 июля 2011

Это не Perl , который выполняет команду, это оболочка, вызываемая Perl с заданной строкой в ​​качестве аргумента.

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

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

3 голосов
/ 28 июля 2011

Вы можете просто скопировать новые файлы, и старые будут заменены.

cp позволяет управлять режимом перезаписи с помощью флагов i и n; по умолчанию, в любом случае, файлы перезаписываются.

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

 system ("cp -f $intensity /home/alos/Y2H_images/all");
2 голосов
/ 28 июля 2011

Как уже упоминалось в комментариях, использование File :: Copy действительно является лучшим решением. Он перезапишет файл назначения (по крайней мере, в моей системе).

use File::Copy;
copy $intensity, "/home/alos/Y2H_images/all" or die $!;

Если вы хотите проверить, существует ли файл назначения, это можно сделать с помощью:

print "File exists: $intensity\n" if -e $intensity;

Если вы все еще хотите удалить файл перед копированием:

unlink "/home/alos/Y2H_images/all$intensity" or die $!;
2 голосов
/ 28 июля 2011

Если вы называете это в system, это действует как "реальная жизнь". Да.

...