“Nenhum tal arquivo ou diretório” ao usar “-exec” com find

4

Eu tenho um monte de pastas que têm uma subpasta chamada 360.

find . -name '360' -type d -exec 'echo "{}"' \;

saída:

find: echo "./workspace/6875538616c6/raw/2850cd9cf25b/360": No such file or directory

Para cada item encontrado, quero fazer uma chamada curl e acionar um trabalho de criação do Jenkins. Meu problema é que. / Parte no início. Eu deveria ser capaz de cortá-lo assim:

find . -name '360' -type d -exec 'echo {} | cut -c 2-' \;

Mas porque começa com ./, ele será executado ("Nenhum arquivo ou diretório"). Como posso obter o resultado de encontrar, sem o principal ./ ?

atualização:

Aqui está a coisa toda com uma chamada de curling de Jenkins:

find reallylongfolderstructure -name '360' -type d -exec 'curl http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter={}' \; 

saída

08:53:52 find: ‘curl http://user:token@ourdomain/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter=reallylongfolderstructure/something/lol/360’: No such file or directory
    
por Tamás 06.07.2018 / 08:12

2 respostas

8

Você escreve

because it starts with a ./ it will just be executed ("No such file or directory").

Isso não é o que está acontecendo. Você forneceu um único comando para o parâmetro find ... -exec de echo "{}" . Observe que isso não é echo e o diretório encontrado por find ; é um único comando que inclui um espaço em seu nome. O comando find (razoavelmente) não pode executar um comando chamado echo "./workspace/6875538616c6/raw/2850cd9cf25b/360" .

Remova as aspas simples ao redor do parâmetro -exec e talvez você não precise de alterações ou soluções adicionais:

find . -name '360' -type d -exec echo "{}" \;

Da mesma forma, aqui você precisa remover a cotação de todo o valor passado para -exec . Mas neste caso você ainda precisa citar os argumentos de armazenamento para que o shell não possa interpretar & , etc.

find reallylongfolderstructure -name '360' -type d -exec curl 'http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter={}' \; 
    
por 06.07.2018 / 09:19
2

O problema é que você está citando o nome do utilitário e o argumento como uma única string, o que faz com que find tente executar a coisa toda como o nome do comando.

Em vez disso, use

find . -type d -name '360' -exec curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter={}" ';' 

Em algumas implementações antigas de find , {} não será reconhecido como o nome de caminho que find encontrou quando é concatenado com outra string como acima, e você teria que usar um shell filho no lugar:

Com sua chamada para curl :

find -type d -name '360' -exec sh -c '
    for pathname do
        curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter=$pathname"
    done' sh {} +

Veja também:

Em bash :

shopt -s globstar

for pathname in ./**/360/; do
    curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter=$pathname"
done

A opção globstar shell disponibiliza o padrão ** glob. Funciona como * , mas corresponde a barras em nomes de caminho.

    
por 06.07.2018 / 08:30

Tags