How to get only names from find command without path

Solution 1:

Use find trunk/messages/ -name "*.po" -exec basename {} .po \;

Example and explanations:

Create some test files:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

Ok, files get found, including path.

For each result execute basename, and strip the .po part of the name

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2

Solution 2:

You can use -execdir parameter which would print the file without path, e.g.:

find . -name "*.po" -execdir echo {} ';'

Files without extensions:

find . -name "*.txt" -execdir basename {} .po ';'

Note: Since it's not POSIX, BSD find will print clean filenames, however using GNU find will print extra ./.

See: Why GNU find -execdir command behave differently than BSD find?

Solution 3:

Based on a command I found here: http://www.unixcl.com/2009/08/remove-path-from-find-result-in-bash.html

You could do this using sed (which executed faster for me, than the basename approach):

find trunk/messages/ -name "*.po" | sed 's!.*/!!' | sed 's!.po!!'