Como imprimir o nome do arquivo base usando find no Unix?

0

Eu tenho tentado imprimir os nomes dos arquivos base usando find no Unix. Para simplesmente imprimir os nomes dos arquivos, o comando que tenho usado é este

find . -type f -name \*.out -print

Imprime os nomes de caminhos qualificados de caminho completo. Mas eu quero apenas os nomes dos arquivos de base. É por isso que tenho tentado o seguinte comando

find . -type f -name \*.out -exec basename {}

Mas erros e exibe

find: incomplete statement

Por favor, ajude-me a passar.

    
por recmach 21.11.2014 / 08:36

3 respostas

5

Você está com falta do caractere ; para terminar a expressão primária (consulte POSIX find ) :

find . -type f -name \*.out -exec basename {} ';'

O motivo pelo qual você deve escapar ou cite ; porque é o seu separador de lista de shell. Você deve fazer sua casca tratá-lo literalmente. \; , ';' ou ";" todos funcionam bem.

Mas esta solução irá chamar basename para cada arquivo encontrado, torná-lo lento. Se os nomes dos arquivos não contiverem nova linha, você poderá:

find -type f -name '*.out' | sed -e '#.*/##'

Se você tiver GNU versão do coreutils > = 8.16 ou estiver em OSX, você pode usar basename -a :

find -type f -name '*.out' -exec basename -a -- {} +
    
por 21.11.2014 / 09:11
4

Seu comando está faltando um ponto-e-vírgula no final, para finalizar o -exec :

find . -type f -name \*.out -exec basename {} \;

Mas esse comando será executado muito lentamente porque ele cria um processo externo e chama basename para cada correspondência. Se a sua pesquisa for compatível com a opção -printf , convém usar isso:

find . -type f -name \*.out -printf '%f\n'
    
por 21.11.2014 / 08:40
2

você saiu de \;

 find . -type f -name \*.out -exec basename {} \;

você adiciona awk também:

find . -type f -name \*.out -print | awk -F "/" '{print $NF}'
    
por 21.11.2014 / 08:41

Tags