检查“变量”路径中是否存在一个文件

3

我正在尝试查找iPhone应用程序目录中是否存在文件。

不幸的是,应用程序目录因设备而异。

在我的设备上,我使用以下命令来查看文件是否存在:

if  [[ -f "/var/mobile/Applications/D0D2B991-3CDA-457B-9187-1F02A84FF3AB/AppName.app/filename.txt" ]]; then 
    echo "The File Exists"; 
else
    echo "The File Does Not Exist";
fi 

我希望有一个命令可以自动搜索文件是否存在,而无需在路径中指定“变量”名称。
我尝试了以下内容:
if  [[ -f "/var/mobile/Applications/*/AppName.app/filename.txt" ]]; then 
    echo "The File Exists"; 
else 
    echo "The File Does Not Exist"; 
fi 

但是很不幸,它没有找到这个文件,

可能是因为我有两个路径的/var/mobile/Applications/*/AppName.app/,因为我克隆了这个应用程序。

我想找到一个方法来检查在/var/mobile/Applications/*/目录下是否存在任何名为AppName.app的文件夹中的filename.txt文件。

4个回答

2
您可以按照以下步骤进行操作:
[[ $(find /var/mobile/Applications/*/AppName.app/ -name filename.txt -print -quit | wc -l) -gt 0 ]] && echo "The File Exists" || echo "The File Does Not Exist"

1
谢谢,我将Applications/*/AppName.app/添加到目录中,这使得搜索更快![[ $(find /var/mobile/Applications/*/AppName.app/ -name filename.txt | wc -l) -gt 0 ]] && echo "文件存在" || echo "文件不存在" - Fouad
1
假设你在结果中没有进行任何操作,你应该执行-print -quit命令,这样find命令会在找到一个结果后停止搜索。 - Reinstate Monica Please

2
"-f测试只能接受一个参数。您需要将其放入循环中,以检查某个通配符是否存在并且其匹配某个普通文件,例如:"
shopt -s nullglob
found=
for file in /var/mobile/Applications/*/AppName.app/filename.txt; do
  [[ -f $file ]] && found=: && break
done
[[ -n $found ]] && echo "The File Exists" || echo "The File Does Not Exist"

如果您不确定文件的具体位置,可以使用,例如下面的操作,如果找到文件就会提前退出。(适用于gnu,未在bsd上测试过)
if [[ -f $(find /some_root_directory -type f -name 'filename.txt' -print -quit) ]]; then
    echo "The File Exists"
else
    echo "The File Does Not Exist"
fi

在BSD上也能正常工作;-) - janos

1
# if a glob matches nothing, remove it instead of leaving the literal glob
shopt -s nullglob 

# stick all matches in an array
files=( /var/mobile/Applications/*/AppName.app/filename.txt )

case "${#files[@]}" in
  0 ) echo "Sorry, no such file." ;;
  1 ) echo "The file exists: ${files[0]}" ;;
  * ) echo "There are multiple files matching this pattern: ${files[*]}" ;;
esac

考虑到 OP 使用了 -f 测试,我认为他指的是普通文件。 - Reinstate Monica Please
谢谢,你的方法也行,但稍微改变了一下另一个答案,我觉得对我的情况更好。 - Fouad

0

我喜欢这个技术的用途:

if find /var/mobile/Applications/*/AppName.app/ -name filename.txt -print -quit | grep -q .; then
    echo "The File Exists"
else
    echo "The File Does Not Exist"
fi

这种形式比这种形式有一些优势:

[[ $(find ..... -print -quit | wc -l) -gt 0 ]]

因为:

  • 它不需要一个$()子shell
  • 它不需要使用wc计算行数
  • 它不需要使用-gt运算符比较数字
  • 它不需要在[[ ... ]]

基本上,这是一个find ... | grep -q .[[ $(find ... | wc -l) -gt 0 ]]的比较。

或者find ... | grep -q .[[ -f $(find ...) ]]的比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接