I’ve had a search around, and from my perspective using backticks is the only way I can solve this problem. I’m trying to call the mdls command from Perl for each file in a directory to find it’s last accessed time. The issue I’m having is that in the file names I have from find I have unescaped spaces which bash obviously doesn’t like. Is there an easy way to escape all of the white space in my file names before passing them to mdls. Please forgive me if this is an obvious question. I’m quite new to Perl.
my $top_dir = '/Volumes/hydrogen/FLAC';
sub wanted { # Learn about sub routines
if ($File::Find::name) {
my $curr_file_path = $File::Find::name. "\n";
`mdls $curr_file_path`;
print $_;
}
}
find(\&wanted, $top_dir);
If you’re sure the filenames don’t contain newlines (either CR or LF), then pretty much all Unix shells accept backslash quoting, and Perl has the
quotemetafunction to apply it.Unfortunately, that doesn’t work for filenames with newlines, because the shell handles a backslash followed by a newline by deleting both characters instead of just the backslash. So to be really safe, use String::ShellQuote:
That should work on filenames containing anything except a NUL character, which you really shouldn’t be using in filenames.
Both of these solutions are for Unix-style shells only. If you’re on Windows, proper shell quoting is much trickier.