"нет такого файла или каталога" с системными вызовами 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);
}
Другие вопросы по тегам