Por que o grep -r --include = *. js * dirname / .filename não grava todos os arquivos .js em um único arquivo?

1

Estou tentando colocar todos os arquivos js em um diretório e subdiretórios em um único arquivo em ordem lexical. O que fiz de errado?

    
por user5448026 18.10.2015 / 22:46

1 resposta

0

grep é a ferramenta errada para isso, em parte porque apenas emite linhas daqueles arquivos que correspondem ao padrão que você dá (e presumivelmente você quer todas as linhas), e em parte porque você não Não dê um padrão, por isso está usando o primeiro nome de arquivo como o padrão (que é não útil).

Listar todos os arquivos *.js é bastante fácil:

find . -name '*.js'

E concatená-los em um arquivo também é fácil:

find . -name '*.js' | xargs cat

Mas, classificá-los de acordo com a ordem lexical de apenas o nome do arquivo, desconsiderando qualquer diretório em que eles estejam, é mais difícil.

Apenas sort não fará o trabalho, e não há --key opção que irá selecionar o último campo quando o número de campos for desconhecido.

O seguinte usa sed para mover o nome do arquivo para o início da linha, classifica isso e, em seguida, retira-o novamente.

find . -name '*.js' | sed 's:^.*/\([^/]*\)$: 
find . -name '*.js' \
      | sed 's:^.*/\([^/]*\)$: 
find . -name '*.js'
:' | sort | cut -d' ' -f2- \ | xargs cat
:' | sort | cut -d' ' -f2-

Isso não funcionará corretamente se algum dos seus nomes de arquivos ou diretórios tiver espaços.

Você pode extrair o conteúdo adicionando um cat :

find . -name '*.js' | xargs cat
    
por 21.10.2015 / 15:10