使用perl系统调用“没有这样的文件或目录”

时间:2015-06-05 12:52:57

标签: macos perl sed du timemachine

我正在尝试运行一个Perl脚本,该脚本从stdin读取文件名并使用系统命令调用du。当我在命令行上运行du命令时它工作正常但是当使用system()在perl脚本中调用du时,我得到“没有这样的文件或目录”。文件名确实有空格和撇号,我将其传递到perl脚本之前。 perl脚本本身非常简单:

use strict; use warnings;
my $line1;
my @tmutil_args;

while($line1 = <>){
    @tmutil_args = ("du", "-sh", $line1);
    system(@tmutil_args);
}

我还使用shell脚本来转义文件名。单行脚本如下:

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 个答案:

答案 0 :(得分:3)

错误消息告诉您需要什么。它正在尝试打开名称以\n结尾的文件。试试chomp

但实际上你应该使用find w / - exec或xargs,或者使用File::Find遍历perl。这是实现目标的极其脆弱的方式。

find /path/to/root/dir -type f -exec du -sh {} \;

答案 1 :(得分:1)

$line1的内容包括您键入的用于终止字符串的换行符。如果您尝试查找具有该名称的文件,则会导致不匹配,因此请使用chomp将其删除

最好尽可能将变量声明为 late - 最好是在他们的第一个使用点 - 而不是在程序顶部的块中

use strict;
use warnings;

while ( my $filename = <> ) {
    chomp $filename;
    system('du', '-sh', $filename);
}