当存在具有特定名称的文件但忽略具有相同名称的目录时,退出脚本

时间:2014-08-06 16:41:32

标签: linux bash shell

如果一个名为“output”的文件已经存在,而不是一个目录,则该脚本 应显示错误并退出。

这是我到目前为止的代码

for file in *
do
if [ ! -f output ]
then echo "error"
exit 1
fi
done

2 个答案:

答案 0 :(得分:0)

for file in *; do
    if [ "$file" = "output" -a -f "$file" ]; then
        echo "error"
        exit 1
    fi
done

或者

for file in *; do
    if [ "$file" = "output" ] && [ -f "$file" ]; then
        echo "error"
        exit 1
    fi
done

使用bash,这是首选:

for file in *; do
    if [[ $file == output && -f $file ]]; then
        echo "error"
        exit 1
    fi
done

如果你想检查文件名是否包含这个词,不只是完全匹配它:

for file in *; do
    if [[ $file == *output* && -f $file ]]; then
        echo "error"
        exit 1
    fi
done

答案 1 :(得分:0)

为什么我们要处理子目录中的每个文件?很奇怪。

if [ -f output ]; then
    echo "'output exists and is a file"
    exit 1
fi

test命令(也是[)(也是内置到大多数shell(参见bash手册页)),仅当输出是文件时才会对TRUE响应-f output响应。您可以检查它是否是-d的目录。

touch something
if [ -f something ]; then echo "something is a file"; fi
if [ -d something ]; then echo "something is not a file"; fi
rm something

mkdir something
if [ -f something ]; then echo "something is not a subdir"; fi
if [ -d something ]; then echo "something is a subdir"; fi
rmdir something

如果您尝试这些命令,您将获得:

something is a file
something is a subdir

如果您只是查看特定文件/目录是否存在,则无需迭代整个目录内容。