0

im trying to find my .csv files then cd into their directory:

find Documents/notes -type f -name "*.csv" | head -1 | xsel -b

this copies the first file dir into my clipboard and i'd like to then run:

cd $(xsel -b) 

but ofcourse I can't because it's including the filename which isn't a directory.

Is there anyway to omit the filename? is there a better way to do this?

1

2 Answers 2

1

Using the bash shell, enable the ** pattern (matches like *, but also reaches past / in pathnames), then expand the pattern Documents/notes/**/*.csv, and then cd to the directory of the first match:

shopt -s globstar
set -- Documents/notes/**/*.csv
cd "$(dirname "$1")"    # or: cd "${1%/*}"

With zsh, which already has the ** pattern enabled by default, this can be shortened into

cd Documents/notes/**/*.csv([1]:h)

The glob qualifier ([1]:h) returns the directory name ("h" as in "head of the path") of the first match of the given pattern. Change this qualifier to (.[1]:h) to make the pattern match only regular files (or symbolic links to such files).

3
  • how would i enable the ** pattern? Commented Sep 17, 2023 at 20:39
  • @Mathew As I mentioned in the text, the bash shell would require shopt -s globstar, whereas it would be enabled by default in the zsh shell. If you are using some other shell, you should mention this in your question. Commented Sep 17, 2023 at 20:42
  • okay understood thanks! Commented Sep 17, 2023 at 20:44
1

Yes, using only find (need -quit support):

dir=$(find . -name '*.csv' -print -quit)
cd "$(dirname "$dir")"

or

cd "$(dirname "$(find . -name '*.csv' -print -quit)")"

it breaks on the first match.

-quit :

Exit immediately (with return value zero if no errors have occurred). This is different to -prune because -prune only applies to the contents of pruned directories, while -quit simply makes find stop immediately. No child processes will be left running. Any command lines which have been built by -exec ... + or -execdir ... + are invoked before the program is exited. After -quit is executed, no more files specified on the command line will be processed. For example, find /tmp/foo /tmp/bar -print -quit will print only /tmp/foo. One common use of -quit is to stop searching the file system once we have found what we want.

2
  • what do the -print and -quit flags do? cant find docs on them Commented Sep 17, 2023 at 23:01
  • man.archlinux.org/man/find.1 Commented Sep 17, 2023 at 23:12

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.