Eu estou tentando usar find -exec com vários comandos sem nenhum sucesso. Alguém sabe se comandos como os seguintes são possíveis?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
Basicamente, estou tentando imprimir a última linha de cada arquivo txt no diretório atual e imprimir no final da linha, uma vírgula seguida pelo nome do arquivo.
find
página do manual:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.
unixhelp.ed.ac.uk/CGI/man-cgi?findRespostas:
find
aceita várias-exec
partes para o comando. Por exemplo:Observe que, neste caso, o segundo comando será executado apenas se o primeiro retornar com êxito, conforme mencionado por @Caleb. Se você deseja que ambos os comandos sejam executados independentemente do sucesso ou falha, você pode usar esta construção:
fonte
-n
algumas das outras respostas para suprimir a nova linha gerada pelo eco, o que é útil se o seu segundo comando produzir apenas uma linha de saída e você desejar que sejam mais fáceis de ler.fonte
... -exec bash -c ...
em vez de... -exec sh -c ...
.{}
no código do shell. Veja unix.stackexchange.com/questions/156008/…Um dos seguintes:
fonte
$0
. Tente isso com "foobar" em vez de "_":find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;
- a saída: "[foobar] [/ usr / bin / find]".$0
geralmente é o nome do programa (ARGV[0]
).sh -c
seja entre aspas simples, não duplas. Caso contrário,$1
está no escopo errado.'$1'
com aspas duplas desde que escape da variável ("\$1"
). Você também pode escapar de outros caracteres ("\""
).Outra maneira é assim:
em uma linha
multiple_cmd()
" - é uma funçãoexport -f multiple_cmd
" - exportará para que qualquer outro subshell possa vê-lofind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
" - encontre que executará a função no seu exemploDessa maneira, multiple_cmd pode ser tão longo e complexo quanto você precisar.
Espero que isto ajude.
fonte
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;
Existe uma maneira mais fácil:
Alternativamente:
fonte
zcat $file | wc -l
"; done funciona, então obrigado!`
para fazer isso usando barras invertidas da seguinte forma:\`
(ainda, esse é outro bom motivo para usar$()
).Não sei se você pode fazer isso com o find, mas uma solução alternativa seria criar um script de shell e executá-lo com o find.
lastline.sh:
Tornar o script executável
Use
find
:fonte
A primeira resposta de Denis é a resposta para resolver o problema. Mas, na verdade, não é mais uma descoberta com vários comandos em apenas um executivo como o título sugere. Para responder a um executivo com vários comandos, teremos que procurar outra coisa para resolver. Aqui está um exemplo:
Mantenha as últimas 10000 linhas de arquivos .log que foram modificados nos últimos 7 dias usando 1 comando exec usando várias referências {}
1) veja o que o comando fará em quais arquivos:
2) Faça: (não observe "\>", mas apenas ">" isso é desejado)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
fonte
Graças a Camilo Martin, pude responder a uma pergunta relacionada:
O que eu queria fazer era
o que não funcionou. Contudo,
funciona, então obrigado!
fonte
Estendendo a resposta do @ Tinker,
No meu caso, eu precisava fazer um
command | command | command
interior no-exec
para imprimir o nome do arquivo e o texto encontrado nos arquivos que contêm um determinado texto.Consegui fazer isso com:
o resultado é:
fonte
/dev/null
como um segundo argumento para ogrep
comando com um-exec
parâmetro:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
deve usar xargs :)
outro (trabalhando no osx)
fonte
find
situações em que o número de arquivos correspondentes é muito grande para uma linha de comando.-exec
é uma maneira de contornar esse limite. A tubulação para um utilitário perde esse benefício.xargs -n
existe para escolher o número de correspondências por chamada.xargs -n 1 foocmd
será executadofoocmd {}
para cada partida.Uma
find+xargs
respostaO exemplo abaixo encontra todos os
.html
arquivos e cria uma cópia com a.BAK
extensão anexada (por exemplo,1.html
>1.html.BAK
).Comando único com vários espaços reservados
Vários comandos com vários espaços reservados
Este comando também funcionará com arquivos que começam com um hífen ou contêm espaços, como
-my file.html
graças à citação de parâmetros e--
depois ocp
sinal paracp
o final dos parâmetros e o início dos nomes de arquivos reais.fonte