Encontre com caminho absoluto dentro de um bashscript | nome de base dos xargs

0

Eu tenho que encontrar recursivamente dentro de um script bash. Como eu posso invocar o script bash de qualquer lugar, sou forçado a usar o caminho absoluto. Às vezes, o caminho absoluto pode ficar muito longo e a saída é tediosa no seguinte:

#!/usr/bin/env bash
find /long/absolute/path -type f | sort

Então eu fiz:

#!/usr/bin/env bash
find /long/absolute/path -type f | xargs -L 1 -I @ echo $(basename @) | sort

Mas isso não dá o nome de base. Você poderia, por favor, descobrir onde estou indo errado?

    
por Nikhil 17.09.2018 / 20:34

2 respostas

2

Você errou de duas maneiras:

  1. Você está passando nomes de arquivos semi-arbitrários de find a dois canais - para xargs e, em seguida, para sort . Use -print0 com terminação nula de find , se possível, ou incorpore as ações dentro de -exec , como maulinglawns demonstrou .

  2. SE você tinha nomes de arquivos que nunca continham caracteres de $IFS , seu comando ainda falhava porque você pediu a xargs para executar o eco com uma substituição de comando; essa substituição de comando solicita basename para gerar o nome base de @ , o que provavelmente não existe. Mais perto teria sido:

    find /long/absolute/path -type f | xargs -L 1 -I @ basename @ | sort
    

... como isso teria permitido que xargs interpole os nomes dos arquivos como argumentos para basename .

    
por 17.09.2018 / 20:56
1

Isso funciona para mim:

find /some/long/path/ -type f -exec basename {} \;| sort
    
por 17.09.2018 / 20:43