首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash -检查两个文件是否存在,并为现有文件打印各自的文件名。

Bash -检查两个文件是否存在,并为现有文件打印各自的文件名。
EN

Unix & Linux用户
提问于 2021-02-05 22:38:06
回答 1查看 1.1K关注 0票数 0

因此,我已经知道如何检查特定文件的存在:

代码语言:javascript
复制
if [ -f ~/file1 ]; then echo "is there" ; else echo "not there" ; fi
if [ -f ~/file2 ]; then echo "is there" ; else echo "not there" ; fi

另外,对于两个文件的存在:

代码语言:javascript
复制
[[ -f file1 && -f file2 ]] && echo "both" || echo "not"

然而,我不知道的是如何知道两个不同文件的存在,同时也打印它们各自的名称(如果其中任何一个存在,如果两者都存在,或者如果它们都不存在,则打印一个错误.)

因此:

  • 如果file1存在,但file2不存在,则会将file1打印为已存在的,反之亦然。
  • 如果file1和file2存在->,则打印两个文件名。
  • 如果不存在->,它们的文件名将被打印为不存在的.
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-02-05 22:44:21

我会在一个循环中这样做:

代码语言:javascript
复制
for pathname in ~/file1 ~/file2; do
    if [ -e "$pathname" ]; then
        printf '"%s" exists\n' "$pathname"
    else
        printf '"%s" does not exist\n' "$pathname"
    fi
done

这基本上是对循环头中提到的每个路径名的存在性进行单一测试,并根据测试结果来决定输出内容。输出提到所检查的路径名和测试结果。

如果路径名匹配一个简单的模式,那么这可以在循环中使用:

代码语言:javascript
复制
for pathname in ~/file[12]; do ...; done

这个问题也可以解释为:打印每个现有路径名,但如果不存在任何文件,则打印所有路径名,并注明它们不存在。

代码语言:javascript
复制
set -- ~/file1 ~/file2

found=false
for pathname do
    if [ -e "$pathname" ]; then
        printf '"%s" exists\n' "$pathname"
        found=true
    fi
done

if ! "$found"; then
    printf '"%s" does not exist\n' "$@"
fi

我在这里使用位置参数列表作为列表,保存我们想要检查的路径名。我这样做是因为我们可能希望循环这个列表两次;一次是使用我们的-e测试,然后在调用printf时(隐式地),如果发现没有文件存在的话。

代之以在bash中使用数组(需要更多地输入):

代码语言:javascript
复制
files=( ~/file1 ~/file2 )

found=false
for pathname in "${files[@]}"; do
    if [ -e "$pathname" ]; then
        printf '"%s" exists\n' "$pathname"
        found=true
    fi
done

if ! "$found"; then
    printf '"%s" does not exist\n' "${files[@]}"
fi

请注意,files=( ~/file1 ~/file2 )也可以编写

代码语言:javascript
复制
files[0]=~/file1
files[1]=~/file2

只是关于-f测试和-e测试的评论。-e测试测试是否存在,而-f测试测试是否存在和文件类型。如果路径名不引用常规文件(或普通文件的符号链接),则-f测试可能为假,而-e测试则可能为真。“常规文件”是指不是目录、套接字、命名管道或任何其他常见Unix文件类型的文件。

在我的回答中,我选择了-e测试,而不是-f测试,因为您在问题中反复使用了“存在”一词,而没有提到任何关于文件类型的内容。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/632909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档