我正在尝试运行一个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备份的大小。所以有人能告诉我我需要什么吗?
答案 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);
}