【发布时间】:2020-11-27 12:14:09
【问题描述】:
我有一个脚本,它将文件名(及其完整路径)作为参数并将它们从系统中删除。
代码如下:
#!/usr/bin/perl
use strict; use warnings;
warn "No arguments/files names passed to the script: $!\n" unless @ARGV;
my $count = 0;
foreach (@ARGV) {
my $cmd = "rm -rf $_";
my $exit_code = system($cmd);
if($exit_code != 0){
print "Command $cmd failed with an exit code of $exit_code.\n";
exit($exit_code >> 8);
} else {
print "Command $cmd successful!\n";
$count++;
}
}
print "Out of ".scalar(@ARGV)." file(s) ".$count." file(s) deleted\n";
我有两个问题:
- 在这里,如果我通过虚拟文件说该文件不存在,它会给我
$exit_code作为0。怎么可能?不应该通过0以外的退出代码吗? - 当我以 Perl 方式
unlink $_;删除文件时,它不会删除它们。如何使用unlink命令强制删除?
【问题讨论】:
-
退出代码为 0 表示系统调用成功。 perls
unlink将删除文件,只要您有权删除它们。您需要确保您拥有文件的绝对路径或来自调用脚本的 dir 的相对路径。 -
rm -f :忽略不存在的文件和参数,从不提示。这就是 rm 返回 0 的原因,您使用的是 -f 选项。您可以在删除文件之前检查文件是否存在
-
@BryanK 实际上创建文件的用户正在使用绝对路径删除这些文件。我相信在这里我不会遇到任何许可问题。但问题是为什么
unlink不能像rm一样工作? -
unlink当然会删除文件。如果没有,那是因为文件权限或者锁,那么你可以查看unlink的返回码。显示用于不成功的unlink尝试的代码。 -
@TLP
unlink可以强制删除文件吗?
标签: perl