Search file path linux

Find file in directory from command line

In editors/ides such as eclipse and textmate, there are shortcuts to quickly find a particular file in a project directory. Is there a similar tool to do full path completion on filenames within a directory (recursively), in bash or other shell? I have projects with alot of directories, and deep ones at that (sigh, java). Hitting tab in the shell only cycles thru files in the immediate directory, thats not enough =/

8 Answers 8

find /root/directory/to/search -name 'filename.*' # Directory is optional (defaults to cwd) 

Standard UNIX globbing is supported. See man find for more information.

If you’re using Vim, you can use:

Or :tabn or any Vim command which accepts a filename.

@Bryan Oakley, Thanks for the edit, but it overwrote my addition about Vim! I reworded the directory argument in my answer. Thanks.

Here’s an attempt at making an alias out of it for searching current directory alias ff=»find . -name » . Usage: ff Rand* ff exactname.c , etc.

If you’re looking to do something with a list of files, you can use find combined with the bash $() construct (better than backticks since it’s allowed to nest).

for example, say you’re at the top level of your project directory and you want a list of all C files starting with «btree». The command:

will return a list of them. But this doesn’t really help with doing something with them.

So, let’s further assume you want to search all those file for the string «ERROR» or edit them all. You can execute one of:

grep ERROR $(find . -type f -name 'btree*.c') vi $(find . -type f -name 'btree*.c') 

I use ls -R, piped to grep like this:

where -R means recursively list all the files, and -i means case-insensitive. Finally, the patter could be something like this: «std*.h» or «^io» (anything that starts with «io» in the file name)

When I was in the UNIX world (using tcsh (sigh. )), I used to have all sorts of «find» aliases/scripts setup for searching for files. I think the default «find» syntax is a little clunky, so I used to have aliases/scripts to pipe «find . -print» into grep, which allows you to use regular expressions for searching:

# finds all .java files starting in current directory find . -print | grep '\.java' #finds all .java files whose name contains "Message" find . -print | grep '.*Message.*\.java' 

Of course, the above examples can be done with plain-old find, but if you have a more specific search, grep can help quite a bit. This works pretty well, unless «find . -print» has too many directories to recurse through. then it gets pretty slow. (for example, you wouldn’t want to do this starting in root «/»)

Читайте также:  Кали линукс обновить все пакеты

I use this script to quickly find files across directories in a project. I have found it works great and takes advantage of Vim’s autocomplete by opening up and closing an new buffer for the search. It also smartly completes as much as possible for you so you can usually just type a character or two and open the file across any directory in your project. I started using it specifically because of a Java project and it has saved me a lot of time. You just build the cache once when you start your editing session by typing :FC (directory names). You can also just use . to get the current directory and all subdirectories. After that you just type :FF (or FS to open up a new split) and it will open up a new buffer to select the file you want. After you select the file the temp buffer closes and you are inside the requested file and can start editing. In addition, here is another link on Stack Overflow that may help.

The linux/unix «find» command.

Источник

Find a file by name using command-line

If it is already installed, new filename might not be postgis-2.0.0 anymore. Usually after installations via package managers, executables would be in one of the $PATH folders, try which postgis to see the location. If it returns nothing, only then you should manually look for file location.

9 Answers 9

Try find ~/ -type f -name «postgis-2.0.0» instead.

Using . will only search the current directory. ~/ will search your entire home directory (likely where you downloaded it to). If you used wget as root, its possible it could be somewhere else so you could use / to search the whole filesystem.

I get find: /Users/UserName//Library/Saved Application State/com.bitrock.appinstaller.savedState: Permission denied error. it appears on every execution of the command. How to get rid of it?

sudo find / -type d -name "postgis-2.0.0" 

The . means search only in the current directory, it is best to search everything from root if you really don’t know. Also, type -f means search for files, not folders. Adding sudo allows it to search in all folders/subfolders.

Читайте также:  Передать файл через ftp linux

Your syntax for locate is correct, but you may have to run

first. For whatever reason, I never have good luck with locate though.

locate uses database of files and directories made by updatedb . So if you have downloaded a new file there is more chance that your updatedb has not updated the database of files and directories. You can use sudo updatedb before using locate utility program. updatedb generally runs once a day by itself on linux systems.

The other answers are good, but I find omitting Permission denied statements gives me clearer answers (omits stderr s due to not running sudo ):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null 
  • / can be replaced with the directory you want to start your search from
  • f can be replaced with d if you’re searching for a directory instead of a file
  • -iname can be replaced with -name if you want the search to be case sensitive
  • the * s in the search term can be omitted if you don’t want the wildcards in the search
find / -type f 2>/dev/null | grep "postgis-2.0.0" 

This way returns results if the search-term matches anywhere in the complete file path, e.g. /home/postgis-2.0.0/docs/Readme.txt

There are -regex and -iregex switches for searching with Regular Expressions , which would find the path mentions as well. Suggestion to find any item which is a file ( -type f ) then grep is more resource expensive. Permission denied happens when user doesn’t have access to files or folders, using sudo before find will allow find to see all files.

find is one of the most useful Linux/Unix tools.

Try find . -type d | grep DIRNAME

  • where you can change ‘.'(look into the Current Directory) to ‘/'(look into the entire system) or ‘~/'(look into the Home Directory).
  • where you can change «-name» to «-iname» if you want no case sensitive.
  • where you can change «file_name«(a file that can start and end with whatever it is) to the exactly name of the file.
Читайте также:  Linux usb flash repair

This should simplify the locating of file:

This would give you the full path to the file

Tree lists the contents of directories in a tree-like format. the -f tells tree to give the full path to the file. since we have no idea of its location or parent location, good to search from the filesystem root / recursively downwards. We then send the output to grep to highlight our word, postgis-2.0.0

$ find . -type f | grep IMG_20171225_*
Gives
./03-05—2018/IMG_20171225_200513.jpg
The DOT after the command find is to state a starting point,
Hence — the current folder,
«piped» (=filtered) through the name filter IMG_20171225_*

While find command is simplest way to recursively traverse the directory tree, there are other ways and in particular the two scripting languages that come with Ubuntu by default already have the ability to do so.

bash

bash has a very nice globstar shell option, which allows for recursive traversal of the directory tree. All we need to do is test for whether item in the ./**/* expansion is a file and whether it contains the desired text:

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done ./testdir/texts/postgis-2.0.0 

Perl

Perl has Find module, which allows to perform recursive traversal of directory tree, and via subroutine perform specific action on them. With a small script, you can traverse directory tree, push files that contain the desired string into array, and then print it like so:

#!/usr/bin/env perl use strict; use warnings; use File::Find; my @wanted_files; find( sub< -f $_ && $_ =~ $ARGV[0] && push @wanted_files,$File::Find::name >, "." ); foreach(@wanted_files)
$ ./find_file.pl "postgis-2.0.0" ./testdir/texts/postgis-2.0.0 

Python

Python is another scripting language that is used very widely in Ubuntu world. In particular, it has os.walk() module which allows us to perform the same action as above — traverse directory tree and obtain list of files that contain desired string.

As one-liner this can be done as so:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])' ['./testdir/texts/postgis-2.0.0'] 

Full script would look like so:

#!/usr/bin/env python import os; for r,s,f in os.walk("."): for i in f: if "postgis-2.0.0" in i: print(os.path.join(r,i)) 

Источник

Оцените статью
Adblock
detector