Equivalente ao GNU encontra flag -printf em outras implementações de localização

0

Especificamente, em mkinitcpio o comando find -mindepth 1 -printf '%P%code%' é usado, o que seria uma maneira de recriar um comando com saída idêntica sem o sinalizador -printf. link Este é o script completo para o caso de ser útil.

    
por E5ten 18.09.2018 / 04:01

2 respostas

0

%P fornecerá o caminho relativo do arquivo a partir do diretório usado como ponto de partida, de modo que se find for executado com some/path como ponto de partida e encontrar o caminho some/path/to/file , então %P será expandido para to/file .

Quando o GNU find não recebe um ponto de partida (como no comando fornecido na pergunta), ele usará o diretório atual ( . ) como ponto de partida. Por isso, o formato %P removerá ./ dos caminhos encontrados nesse caso.

Para fazer o mesmo que -printf '%Pfind' com implementações não-GNU -mindepth , assumindo que find ainda está disponível (como em sh -c em sistemas BSD):

find . -mindepth 1 -exec sh -c '
    for pathname do
        printf "%s
topdir=/some/path

find "$topdir" -mindepth 1 -exec sh -c '
    topdir=${1%/}; shift
    for pathname do
        printf "%s
find . -mindepth 1 -exec sh -c '
    for pathname do
        printf "%s
topdir=/some/path

find "$topdir" -mindepth 1 -exec sh -c '
    topdir=${1%/}; shift
    for pathname do
        printf "%s%pre%" "${pathname#$topdir/}"
    done' sh "$topdir" {} +
" "${pathname#./}" done' sh {} +
" "${pathname#$topdir/}" done' sh "$topdir" {} +
" "${pathname#./}" done' sh {} +

O script incorporado find obterá um lote de nomes de caminho de ./ para trabalhar e usará uma expansão de parâmetro padrão que removerá o %code% inicial do nome do caminho antes de imprimi-lo com um caractere de finalização.

A mesma coisa, mas com uma variável segurando o caminho do diretório de nível superior single :

%pre%     
por 18.09.2018 / 15:52
0

Em -printf '%P%P' , o ./ está apenas removendo o sed 's|^\./||' inicial da frente do nome do arquivo. Você pode fazer o equivalente com tr '\n' '%code%' . A parte %code% produz um caractere nulo em vez de uma nova linha entre cada nome de arquivo. Você pode converter newline para null com %code% . Então você pode tentar

find . -mindepth 1 -print | sed 's|^\./||' | tr '\n' '
find . -mindepth 1 -print | sed 's|^\./||' | tr '\n' '%pre%'
'

Se algum nome contiver uma nova linha, isso irá corrompê-lo, traduzindo essa nova linha para null.

    
por 18.09.2018 / 15:33

Tags