获取从全局扩展返回的文件的完整路径

时间:2018-09-28 09:59:49

标签: bash shell

如何通过通配符找到文件的路径:

文件路径:/DIRECTORY_random_number/myFile

#!/bin/bash
FILE='DIRECTORY_'*'/myFile'
if [ -f $FILE ]; then
   echo "this is the full path of this file..."
fi

2 个答案:

答案 0 :(得分:1)

使用变量不是解决此问题的最佳方法。此外,与单/双引号一起使用时,glob不会扩展。使用数组,如果您要查找的是单个文件,则可以使用*

使用数组扩展来检索完整路径。
shopt -s nullglob
filePath=(/DIRECTORY_*/newfile)

if (( "${#filePath[@]}" )); then
    printf 'Matching file name found as %s\n' "${filePath[*]}"
fi

如果再次使用bourne shell bash,请启用并扩展shell选项nullglob,以使空扩展不属于数组。

这种方法比进行无引号的变量扩展(如果文件名中包含特殊字符)对文件名进行Word-Splitting更好。

答案 1 :(得分:1)

您可以按for循环执行此操作,尤其是在没有数组的POSIX shell中。

for f in DIRECTORY_*/myFile; do
    if [ -f "$f" ]; then
        ...
    fi
    break
done

是否需要break语句是一个判断电话。您的意图是该模式仅匹配一个文件,但是您可以保证吗?如果可以,则不需要break。当然,如果匹配匹配多个文件,您如何知道第一个匹配就是您实际想要的文件?通常,这样假设您的文件系统是一个坏主意。 了解您要查找的文件,而不是假设您的模式有唯一的匹配项。