检查"变量"中是否存在文件。路径

时间:2014-04-20 23:53:16

标签: bash shell command-line command

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

不幸的是,apps目录与设备不同

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

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/的2条路径。

我想找到一种方法,能够找到文件filename.txt是否存在于此目录AppName.app中名为/var/mobile/Applications/*/的任何文件夹中

4 个答案:

答案 0 :(得分: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 :(得分:2)

-f测试只能接受一个参数。你需要将它放在循环中以检查是否存在一些glob并且它匹配一些常规文件,即

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

答案 2 :(得分: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

答案 3 :(得分: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 ...) ]]