Como posso retornar apenas nomes de arquivos do comando find?

10

Eu estou olhando para obter uma lista de apenas nomes de arquivos (sem o resto do caminho) ao executar o comando find a partir de um terminal. Como faço isso no mac?

    
por blueberryfields 16.07.2013 / 21:41

7 respostas

15

Com nome de base:

find . -type f -exec basename {} \;

    
por 16.07.2013 / 22:30
6

O Evilsoup mencionou que o que foi publicado não funciona para nomes de arquivos espaçados. Então, você pode usar:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
    
por 16.07.2013 / 22:20
2

Com o GNU find, você pode fazer:

 find ~/tmp/ -printf "%f\n"

Provavelmente vale a pena tentar também no OS X.

    
por 16.07.2013 / 23:09
2

Existe uma maneira melhor de remover tudo, menos a última parte de um caminho de arquivo; com o awk É melhor porque o awk não é executado uma vez para cada arquivo. Em alguns casos, isso é importante.

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

Procuramos apenas arquivos em ~ / tmp e obtemos uma lista onde cada entrada é separada por barras. Assim, usamos uma barra como o separador de campo (-F /) e imprimimos o parâmetro de campo ($ 1 .. $ 9) que corresponde ao último campo ($ NF).

    
por 17.07.2013 / 16:01
2

EDITAR :

Usando sed :

$ find . -type f | sed 's/.*\///'

Usando o comando xargs , conforme mencionado na resposta de @nerdwaller

$ find . -type f -print0 | xargs --null -n1 basename
    
por 16.07.2013 / 22:44
1

E sobre isso:

find … | egrep -o -e '[^/]+$'

Vantagem: somente exatamente um processo adicional é gerado, não um para cada resultado.

    
por 17.07.2013 / 01:19
0

Você pode chamar sh da opção -exec do find e evitar o uso de pipes desnecessários. Isso também tem a vantagem de você não precisar se preocupar com nomes de arquivos engraçados (espaços, novas linhas, etc.):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
    
por 17.07.2013 / 00:30