Jak uzyskać tylko nazwy z polecenia find bez ścieżki

14

Próbuję uzyskać tylko nazwy z wyniku wyszukiwania za pomocą funkcji find, ale zawsze zawiera również katalogi. Jak mogę wydrukować tylko nazwy (lub przypisać do zmiennej) za pomocą funkcji find

find trunk/messages/ -name "*.po" -printf '%f\n'

podobne polecenie, aby przypisać to do zmiennej, np. „zasób”, aby użyć go później.

EDYCJA: I jeśli to możliwe, tylko nazwa z wyłączeniem rozszerzenia.

Obudź się
źródło

Odpowiedzi:

20

Posługiwać się find trunk/messages/ -name "*.po" -exec basename {} .po \;

Przykład i wyjaśnienia:

Utwórz kilka plików testowych:

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

Ok, znaleziono pliki, w tym ścieżkę.

Dla każdego wyniku wykonaj basenamei usuń część .po nazwy

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2
Hennes
źródło
Wielkie dzięki :). Czy mogę usunąć tylko rozszerzenie PO z katalogu? Mam na myśli: dir1 / po1.po i dir2 / po2.po czy można je otrzymać jak dir1 / po1 i dir2 / po2?
pobudka
@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck
@slhck dzięki. wreszcie muszę pobrać nazwę pliku bez rozszerzenia i ostatni folder, w którym się znajduje: np .: katalog1 / katalog_1 / katalog_1 / po1.po i katalog2 / katalog_2 / katalog_2 / po2.po powinny mieć zmienną taką jak: katalog_1 / katalog1 odpowiednio subsubdir2 / po2.
pobudka
@ user1754665 Hmm, możefind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck
@Hennes Jaki jest cel odwrotnego ukośnika przed otwierającym nawias klamrowy w ostatnim find?
Utku
3

Możesz użyć -execdirparametru, który wydrukuje plik bez ścieżki, np .:

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

Pliki bez rozszerzeń:

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

Uwaga: Ponieważ nie jest to POSIX, BSD findwydrukuje czyste nazwy plików, jednak użycie GNU findspowoduje wydrukowanie dodatkowych ./.

Zobacz: Dlaczego polecenie GNU find -execdir zachowuje się inaczej niż polecenie BSD find?

kenorb
źródło