可能性のあるファイルの存在を確認する必要があります
- 名前に空白が含まれている
- 名前に非ASCII(ウムラウトなど)が含まれている
空白のために私は使用しますString::ShellQuote
。ただし、これはOSXで実行した場合(他のOSについてはまだわかりません)、Umlautsではうまく機能しないようです。
# vim: ft=perl fenc=utf8
# perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
use strict;
use warnings;
use String::ShellQuote;
my @files = map {$_, shell_quote($_)} ("AOU.tmp", "ÄÖÜ.tmp", "A OU.tmp", "Ä ÖU.tmp");
foreach my $file ( @files, ) {
print "$file:\t";
`touch $file`;
print "created, " if( !$? ) ;
print "EXISTS (says Perl), " if( -e $file );
`ls -1 $file >/dev/null`;
print "EXISTS (says ls), " if( !$? );
print "\n";
}
出力:
OU.tmp: created, EXISTS (says Perl), EXISTS (says ls),
AOU.tmp: created, EXISTS (says Perl), EXISTS (says ls),
ÄÖÜ.tmp: created, EXISTS (says Perl), EXISTS (says ls),
'ÄÖÜ.tmp': created, EXISTS (says ls),
A OU.tmp: created, EXISTS (says Perl), EXISTS (says ls),
'A OU.tmp': created, EXISTS (says ls),
Ä ÖU.tmp: created, EXISTS (says Perl), EXISTS (says ls),
'Ä ÖU.tmp': created, EXISTS (says ls),
質問:拡張文字を含む可能性のあるファイル名を確実にshell_quoteするにはどうすればよいですか?
補足:これは、これらの完全に優れたOS-Xの典型的なUTF8正規化の問題の1つであると思います(ウムラウトの合成済みエンコードと分解エンコード)。String::ShellQuote
それでも、それで対処できるはずだと思います。