Question

I am trying to find if a file exist in an iPhone application directory

Unfortunately, apps directory differs from a device to another

On my device, i use the following command to see if the file exists:

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 

I want a command that would automatically search if the file exist without the need to specify the "variable" name inside the path.

I tried this:

if  [[ -f "/var/mobile/Applications/*/AppName.app/filename.txt" ]]; then 
    echo "The File Exists"; 
else 
    echo "The File Does Not Exist"; 
fi 

But no luck, it didn't find the file,

Maybe because i have 2 path of /var/mobile/Applications/*/AppName.app/ since i have cloned the app.

I would like to get a way to be able to find if the file filename.txt exists inside any folder named AppName.app inside this directory /var/mobile/Applications/*/

Was it helpful?

Solution

You can do this as follows:

[[ $(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"

OTHER TIPS

The -f test can only take one argument. You would need to put it in a loop to check if some glob exists and its matches some regular file, i.e.

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"

If you're not sure specifically where the file is located you can use , doing something like below which will exit early if found. (should work for gnu , haven't tested on 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
# 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

I like this technique for the purpose:

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

This has some advantages over this form:

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

Because:

  • It doesn't need a $() subshell
  • It doesn't need to count lines with wc
  • It doesn't need to compare numbers with the -gt operator
  • It doesn't need to be inside a [[ ... ]]

Basically it's a find ... | grep -q . versus [[ $(find ... | wc -l) -gt 0 ]]

Or find ... | grep -q . versus [[ -f $(find ...) ]]

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top