使用-e标志[perl]检查文件或目录是否存在

时间:2018-12-05 00:50:16

标签: perl

这可能是一个愚蠢的错误,但我似乎无法理解为什么会这样做。我编写了以下脚本,该脚本遍历一个文件的行,并且仅在该行(实际上是路径)不是有效路径时才将它们插入到另一个文件中。

open(my $fh_dst, '>>', $dst) or die
open(my $fh_src, '<', $src) or die;
while (my $file = <$fh_src>) {
    chmod($file);
    print $fh_dst $file unless(-e $file);
}
close ($fh_src);
close ($fh_dst);

它确实将路径插入到另一个文件中,但是由于某种原因,如果我转到Linux命令行并在其中一个路径上执行ls -la,则表明目录或文件存在。我确保-e也适用于目录,所以不是。可能是什么问题?

2 个答案:

答案 0 :(得分:1)

需要

<script src="https://unpkg.com/vue@latest/dist/vue.js"></script> <div id="app"> <input type="text" v-model="query" placeholder="Search for a user" @focus="dimUsers()" @blur="undimUsers()"> <ul> <li v-for="user in userList.users" :key="user.localized_name"> <img v-bind:src="user.portrait" class="userPortrait" :class="{'selectedUser': selectedUserPortrait.includes(user.portrait), 'dimmed': searching}" @click="loadUser(user)"> </li> </ul> <div>{{userSelected.localized_name}}</div> </div>才能删除换行符,该换行符终止了您从文件中读取的行。本质上,您是在检查chomp是否存在,是否存在。我认为您打算打file␊,但您打了chomp。固定:

chmod

答案 1 :(得分:0)

@Shawn是正确的,并纠正chmod,并针对名为DUET.pl(蛋白质建模脚本)的文件对其进行测试。基本上“ DUET.pl \ n”不存在。您还需要在“ chmod”命令上添加一个exist语句,否则如果文件不存在,它将引发错误。

use strict;
use warnings;
my $input = '/Users/michaelg/Desktop/test.txt';
my $test_output = '/Users/michaelg/Desktop/out.txt';

    open(my $fh_dst, '>>', $test_output) or die "$!";
    open(my $fh_src, '<', $input) or die "$!";
    while (my $file = <$fh_src>) {
        chomp $file;
        chmod (0755, $file) if -e $file;
        print $fh_dst $file . "\n", unless -e $file;
    }
    close ($fh_src);
    close ($fh_dst);
__DATA__

文件test.txt的内容是文件DUET.pl的路径。 DUET.pl存在于上述位置
/Users/michaelg/Desktop/DUET.pl

带有chomp,输出文件

(空白)

没有chomp,即#chomp $ file,输出文件(加上错误) /Users/michaelg/Desktop/DUET.pl

此外,带有排骨(壳),

ls -l /Users/michaelg/Desktop/DUET.pl
-rwxr-xr-x@ 1 michaelg  staff  xxx  4 Dec xx:xx DUET.pl
Without chomp,
-rwx------@ 1 michaelg  staff  xxx  4 Dec xx:xx DUET.pl

注意xx:xx时间戳已删除