Como obter apenas nomes do comando find sem caminho

14

Estou tentando obter apenas os nomes do resultado da pesquisa usando find, mas sempre inclui os diretórios também. Como posso imprimir apenas os nomes (ou atribuir a uma variável) usando find

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

um comando semelhante para atribuir isso a uma variável, por exemplo, "recurso" para usá-lo posteriormente.

EDIT: E, se possível, apenas o nome excluindo a extensão.

acorde
fonte

Respostas:

20

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

Exemplo e explicações:

Crie alguns arquivos de teste:

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

Ok, os arquivos são encontrados, incluindo o caminho.

Para cada resultado basename, execute e retire a parte .po do nome

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2
Hennes
fonte
Muito obrigado :). Posso retirar apenas a extensão do PO dos dirs? Quero dizer: dir1 / po1.po e dir2 / po2.po eles podem ser obtidos como dir1 / po1 e dir2 / po2?
wakeup 02/02
@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck
@slhck thanks. por fim, preciso obter o nome do arquivo sem extensão e a última pasta em que está: por exemplo: dir1 / subdir1 / subsubdir1 / po1.po e dir2 / subdir2 / subsubdir2 / po2.po devem ser configurados para uma variável como: subsubdir1 / po1 subsubdir2 / po2, respectivamente.
wakeup 02/02
@ user1754665 Hmm, talvezfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck 2/13
@Hennes Qual é o objetivo da barra invertida antes da última faixa find?
Utku
3

Você pode usar o -execdirparâmetro que imprimiria o arquivo sem caminho, por exemplo:

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

Arquivos sem extensões:

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

Nota: Como não é POSIX, o BSD findimprimirá nomes de arquivos limpos, no entanto, usar o GNU findimprimirá extra ./.

Veja: Por que o comando GNU find -execdir se comporta de maneira diferente do que o BSD find?

kenorb
fonte