检查目录是否存在无效

时间:2013-05-08 16:00:27

标签: linux bash

我有一个文本文件(qrs.txt),其中包含目录名称(每行一个),并且在我的服务器上与脚本相同的目录中,我有这些文件夹,文本文件中有相应的名称。

这是我的剧本:

#!/bin/bash

while read p; do
  if [ ! -d "$p" ];
    then
        echo "ERROR $p" >> log.txt
    else
        echo "GOOD" >> log.txt
    fi
done < qrs.txt

qrs.txt:

1992300000183805
1992300001176204
1992300002145500
1992300003104507
1992300004104902
1992300005133703
1992300006117802
1992300007144501
1992300008172803
1992300009189005
1992300010146307
1992300011151700
1992300012190007
1992300013126802
1992300014111508
1992300015193908

当if语句在循环内部时,它总是返回错误,这是不正确的,因为我可以看到文件夹存在。当我把它从循环中取出并检查只有1时,它工作正常......当我在错误的同一行回显$ p时,我可以看到它的检查确实是正确的文件名。

我在这里错过了什么..?

修改

十六进制模式下qrs.txt的屏幕截图:

http://i.snag.gy/25mqJ.jpg

解决!

我的qrs.txt最初采用[dos]格式,但是一旦使用“:set ff = unix”转换为unix格式,脚本就像魅力一样!

2 个答案:

答案 0 :(得分:4)

你的脚本运行正常。

我将您的脚本复制到我的本地计算机上。当我将blh blah放入qrs.txt文件时,每次运行脚本时都会ERROR。我跑了四次。我将blh blah更改为有效路径,然后收到了GOOD

例如,目录1992300000183805可能不是有效路径。您需要完全限定的路径名​​称!例如,/home/user/1992300000183805

ERROR blh blah
ERROR blh blah
GOOD
GOOD

修改

查看@chepner评论,我重新创建了您的问题:

vivim中打开qrs.txt文件。您应该在行尾看到^ M.要删除vi中所有行末尾的^ M个字符,请使用:

:%s/^M//g

这应该可以解决您的问题。如果没有,请在vim中输入:

:set ff=unix

保存文件。

qrs.txt中重新打开vim,然后再次运行上面的正则表达式,或手动删除^M

或者您可以使用perl

perl -pi -e "s/\r/\n/g;" <file>

答案 1 :(得分:0)

好的,看看你提供的文件似乎是相对的目录名 - 因此当你执行脚本时,当前目录非常重要。您是从自己的目录还是从父目录到示例中显示的所有(子)目录执行脚本? 换句话说,你试过:

cd <parent directory>
/path/to/yourscript.sh

更不用说qrs.txt的位置似乎是指定相对而不是绝对路径。因此,如果当前目录中没有qrs.txt,我认为您的脚本不会起作用。