Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I found I asked this question on the wrong stackexchange site.

To find files starting from a certain path, I can use find <path> .... If I want to find 'upwards', i.e. in the parent directory, and it's parent, and..., is there an equivalent tool?

The use case is knowing the right number of dots (../../x.txt or ../../../x.txt?) to use in e.g. a makefile including some common makefile functions somewhere upstream.

Intended usage for a folder structure like this:


$ cd /abc/dce/efg/ghi
$ touch ../../x.txt
$ upfind . -name X*
$ upfind . -name Y* || echo "not found"
not found
$ touch /abc/dce/efg2/x.txt
$ upfind . -name Y* || echo "not found"
not found

So in short:

  • it should search on this folder, it's parent, it's parent's parent...
  • but not in any of their siblings (like 'find' would)
  • it should report the found file(s) relative to the current path
share|improve this question
It appears from the link that you already wrote a script that solved your problem... – Matt Jul 31 '12 at 12:38
@Matt: yes, but I'm allways try to find one better answer, and this is a better forum to do so. – xtofl Jul 31 '12 at 12:50
Ah. Actually, I would think the best forum would be SO, wouldn't it? – Matt Jul 31 '12 at 12:52
up vote 1 down vote accepted

You can just split the path into its constituent directory nodes and search each one discreetly. It is a bash script.

IFS=/; dn=($1); ct=${#dn[@]}
for((i=0; i<ct; i++)); do
  dots=$(for((j=ct-i; j>1; j--)); do printf "../"; done)
  find "$subd" -maxdepth 1 -type f -name "$2" -printf "$dots%f\n"

run upfind $HOME/zt" "Y*" ... which produces the following output
when YABBA exists in /, /home/user, /home/user/zt

share|improve this answer

You can use this simple script. It walks the directory tree upwards and seraches for the specified files.

while [[ $PWD != / ]] ; do
    find "$PWD"/ -maxdepth 1 "$@"
    cd ..


upfind -name 'x*'
share|improve this answer
+1 for simplicity – Bernhard Jul 31 '12 at 11:16

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .