1

stdin からファイル名を読み取り、システム コマンドを使用して du を呼び出す Perl スクリプトを実行しようとしています。コマンドラインで du コマンドを実行すると問題なく動作しますが、perl スクリプトで system() を使用して du を呼び出すと、「No such file or directory.」というメッセージが表示されます。ファイル名には、perl スクリプトに渡す前にエスケープするスペースとアポストロフィが含まれています。perl スクリプト自体は非常に単純です。

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

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

また、シェル スクリプトを使用してファイル名をエスケープします。1 行のスクリプトは次のとおりです。

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

重要なことの 1 つは、これを 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 に答える