"нет такого файла или каталога" с системными вызовами perl
Я пытаюсь запустить сценарий Perl, который читает имена файлов из stdin и вызывает du с помощью системной команды. Когда я запускаю команду du в командной строке, она работает нормально, но когда du вызывается в скрипте perl с помощью system(), я получаю "Нет такого файла или каталога". В имени файла есть пробелы и апостроф, который я избегаю перед передачей в скрипт perl. Сам скрипт на Perl ОЧЕНЬ прост:
use strict; use warnings;
my $line1;
my @tmutil_args;
while($line1 = <>){
@tmutil_args = ("du", "-sh", $line1);
system(@tmutil_args);
}
Я также использую сценарий оболочки для экранирования имени файла. Сценарий в одну строку выглядит следующим образом:
s/[\' ]/\\&/g
Пример имени файла до и после запуска через sed:
/Volumes/Mac Mini Backup 4TB/Backups.backupdb/John's Mac Mini/2015-06-04-132645
/Volumes/Mac\ Mini\ Backup\ 4TB/Backups.backupdb/Pete\'s\ Mac\ Mini/2015-06-04-132645
Я пытался с и без выхода из пробелов и апостроф.
выход:
du: /Volumes/Mac\ Mini\ Backup\ 4TB/Backups.backupdb/Pete\'s\ Mac\ Mini/2015-06-04-132645
: No such file or directory
одна важная вещь, я запускаю это на Mac OS X 10.95 в окне терминала. Perl v5.16.2
Вы можете спросить, что я пытаюсь сделать. Я пытаюсь получить размер отдельных резервных копий Mac TimeMachine.
так может кто-нибудь сказать мне, что мне нужно?
2 ответа
Сообщение об ошибке говорит вам, что вам нужно. Он пытается открыть файл, имя которого заканчивается на \n
, Пытаться chomp
,
Но на самом деле вы должны использовать find w/- exec или xargs или обходить в perl File::Find
, Это чрезвычайно хрупкий способ достижения ваших целей.
find /path/to/root/dir -type f -exec du -sh {} \;
Содержание $line1
включает новую строку, которую вы ввели для завершения строки. Это приведет к несоответствию, если вы попытаетесь найти файл с таким именем, поэтому удалите его, используя chomp
Также лучше объявить ваши переменные как можно позже - желательно в первой точке их использования - а не в блоке в начале программы
use strict;
use warnings;
while ( my $filename = <> ) {
chomp $filename;
system('du', '-sh', $filename);
}