1

我正在尝试运行一个 Perl 脚本,该脚本从标准输入读取文件名并使用系统命令调用 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 备份的大小。

所以谁能告诉我我需要什么?

4

2 回答 2

3

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

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

find /path/to/root/dir -type f -exec du -sh {} \;
于 2015-06-05T13:21:59.027 回答
1

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

最好尽可能地声明你的变量——最好是在它们的第一个使用点——而不是在程序顶部的块中

use strict;
use warnings;

while ( my $filename = <> ) {
    chomp $filename;
    system('du', '-sh', $filename);
}
于 2015-06-05T13:27:30.330 回答