Estou tentando o óbvio:
mc file.tar.gz
mas o tar.gz não abre
alguma ideia?
Estou tentando o óbvio:
mc file.tar.gz
mas o tar.gz não abre
alguma ideia?
O realpath
utilitário de comando agora é definido pelo POSIX em sua edição 8 (2024): realpath — resolver um nome de caminho
realpath [-E|-e] arquivo
O utilitário realpath deve canonizar o nome do caminho especificado pelo operando do arquivo da seguinte forma:
Se uma chamada para a
realpath()
função com o caminho especificado como seu primeiro argumento for bem-sucedida, o caminho canonizado deverá ser o caminho que seria retornado por essarealpath()
chamada. Caso contrário:
Se a opção -e for especificada, a canonização falhará.
Se a opção -E for especificada, então se uma chamada para a
realpath()
função com o caminho especificado como seu primeiro argumento encontrar uma condição de erro diferente de [ENOENT], a canonização falhará; se a chamada encontrar um erro [ENOENT], o realpath expandirá todos os links simbólicos que seriam encontrados em uma tentativa de resolver o caminho especificado usando o algoritmo especificado em XBD 4.16 Pathname Resolution, exceto que quaisquer<slash>
caracteres finais que não sejam também<slash>
caracteres iniciais serão ignorados. Se essa expansão for bem-sucedida e o prefixo do caminho do caminho expandido for resolvido para um diretório existente, o caminho canonizado será o caminho expandido. Em todos os outros casos, a canonização falhará. Se o caminho expandido não estiver vazio, não começar com um<slash>
e tiver exatamente um componente de caminho, ele será tratado como se tivesse um prefixo de caminho de "./
".Se nenhuma opção for especificada, o realpath canonizará o caminho especificado de uma maneira não especificada, de modo que o caminho absoluto resultante não contenha nenhum componente que faça referência a arquivos do tipo link simbólico e não contenha nenhum componente que seja ponto ou ponto-ponto.
Após a canonização bem-sucedida, o realpath gravará o nome do caminho canonizado, seguido por um
<newline>
caractere, na saída padrão.Se a canonização falhar ou o caminho canonizado estiver vazio, nada será gravado na saída padrão, uma mensagem de diagnóstico será gravada no erro padrão e o realpath sairá com status diferente de zero.
[...]
Minha pergunta é: a -e
opção de realpath
já é suportada pelo menos por GNU e Solaris, mas não consigo encontrar nenhuma menção à -E
opção em nenhuma realpath
que eu pudesse verificar (macOS, FreeBSD, Solaris, GNU). O OpenGroup a inventou?
Recentemente, quando li um QA , ele apresentou alguns comportamentos inesperados para mim:
~/findtest % echo three > file\ with\ \"double\ quotes\"
~ % find findtest -type f -exec sh -c 'set -x;cat "{}"' \;
+ cat 'findtest/file with double' quotes
cat: findtest/file with double: No such file or directory
cat: quotes: No such file or directory
IMHO quando a substituição estiver concluída, ela funcionará 'cat findtest/file\ with\ \"double\ quotes\"'
se apenas substituir o nome do arquivo acima, file\ with\ \"double\ quotes\"
o que funcionará. Se mantivermos o wrapper de citação, ele mostrará:
$ cat "findtest/file\ with\ \"double\ quotes\""
cat: 'findtest/file\ with\ "double\ quotes"': No such file or directory
P:
O que essa substituição realmente faz, causando o comportamento um pouco estranho acima com 2 substr 'findtest/file with double' e 'quotes', mas não 'findtest/file with' e 'double quotes' "
como delimitador?
Tenho um arquivo CSV e quero executar um comando para cada linha, usando os campos do arquivo como argumentos separados.
Por exemplo, dado o seguinte arquivo:
foo,42,red
bar,13,blue
baz,27,green
Quero executar os seguintes comandos um após o outro:
my_cmd --arg1 42 --arg2 foo --arg3 red
my_cmd --arg1 13 --arg2 bar --arg3 blue
my_cmd --arg1 27 --arg2 baz --arg3 green
Qual é a maneira mais fácil de conseguir isso? Parece que pode ser possível com xargs, mas não consegui descobrir como exatamente.
Quando eu inicializo no modo de usuário único e listo os snapshots do ZFS nos quais estou interessado, quero reverter para o snapshot "xfcedesktop". No entanto, isso requer que eu digite manualmente o comando zfs rollback snapshotname@xfcedesktop
para cada snapshot, assim:
# zfs list -t snapshot -o name | grep xfcedesktop
zroot@xfcedesktop
zroot/ROOT@xfcedesktop
zroot/ROOT/default@xfcedesktop
zroot/home@xfcedesktop
zroot/home/zoliky@xfcedesktop
zroot/tmp@xfcedesktop
zroot/usr@xfcedesktop
zroot/usr/ports@xfcedesktop
zroot/usr/src@xfcedesktop
zroot/var@xfcedesktop
zroot/var/audit@xfcedesktop
zroot/var/crash@xfcedesktop
zroot/var/log@xfcedesktop
zroot/var/mail@xfcedesktop
zroot/var/tmp@xfcedesktop
# now I need to type this for each line:
zfs rollback zroot@xfcedesktop
zfs rollback zroot/ROOT@xfcedesktop
zfs rollback zroot/ROOT/default@xfcedesktop
.. and so on
Isso consome tempo e é propenso a erros. Estou pensando se há um truque de shell ou um one-liner que me deixaria fazer um loop pela saída do grep e executar os comandos de rollback para cada snapshot. Estou usando sh (não bash) no FreeBSD, executando no modo de usuário único. Idealmente, eu gostaria que fosse um one-liner em vez de um script.
Por que ksh
history -0
(o último comando que é o comando history em si) funciona, mas zsh
falha (só history -1
disponível no meu zsh). Tentei zsh -f
usar opções padrão e ainda falha.
Estou usando a versão ksh Version AJM 93u+ 2012-08-01
e o Zsh v5.9 no MacOS.
Como obtenho uma variável com o comando e os argumentos atuais? Gostaria de usar o código de escape para imprimir isso em uma barra de título do Xterm.
Vejo que Terminal.app no MacOS está determinando o nome do comando invocado de alguma forma. Vejo a seguinte implementação para zsh, no entanto, estou procurando por ksh.
if [ "$SHELL" = '/usr/bin/zsh' ]
then
case $TERM in
rxvt|*term)
precmd() { print -Pn "\e]0;%m:%~\a" }
preexec () { print -Pn "\e]0;$1\a" }
;;
esac
fi
Estou lendo este post sobre o uso do DEBUG trap do ksh ou o poster também comenta que "executar uma tarefa em segundo plano que inspeciona regularmente a saída de ps -o stat= -o args= para ver quais processos são executados em primeiro plano e qual comando eles estão executando" é preferível. Alguém tem mais informações sobre isso?
Este recurso de destaque pode ser feito facilmente em grep
com --color
. Mas grep
não é possível fazer correspondência regular e invertida ao mesmo tempo , por exemplo grep foo -v bar ...
(preciso deste recurso, pois ele --color
só pode ser usado na entrada inicial do pipe |
, então o último grep usará os resultados coloridos que grep foo --color=always ... | grep -v "foo bar"
não removerão essas linhas com "foo bar").
Então eu usei awk
como as dicas do link acima, mas falta o recurso de destaque. Podemos extrair os resultados do regex com match
esubstr
onde envolvemos o padrão regex em match
como /\<no issue\>/
. Podemos então destacar apenas o resultado do regex com códigos de cores ANSI por printf substr($0,1,RSTART-1) "\033[1;31m" substr($0,RSTART,RLENGTH) "\033[0m: " substr($0,RSTART+RLENGTH) "\n"
.
P:
Mas match
não funciona para o boolean expr /foo/ && !/bar/
construído por regex exp's no link de referência. Existe uma solução alternativa elegante (talvez com outras ferramentas)?
Pensei em uma solução temporária /foo/ && !/bar/{match($0,/foo/); printf ...}
, mas isso fará com que o regex funcione duas vezes.
Meu comportamento esperado (Aqui 0. "TODO" pode existir no máximo uma vez em uma linha 1. Eu uso *...*
para mostrar o que deve ser destacado 2. Eu considero apenas /pattern1/ && !/pattern_included_totally_by_pattern1/
, então /foo/ && !/o/
oferecido por Ed Morton não é considerado. Isso é como a lógica grep, que eu primeiro grep some e então grep in aqueles resultados obtidos da execução grep anterior):
# fail
$ echo "TODO foo\nTODO" | grep TODO --color=always | grep -v "TODO foo"
*TODO* foo
*TODO*
# expected
$ echo "TODO foo\nTODO" | awk -v RED="\033[1;31m" -v RESET="\033[0m" '/TODO/ && !/TODO foo/ {match($0,/TODO/); printf substr($0,1,RSTART-1) RED substr($0,RSTART,RLENGTH) RESET substr($0,RSTART+RLENGTH) "\n"}'
*TODO*
Estou usando uma API (do SyncroMSP ) que retorna dados JSON paginados. Posso obter o número de páginas e posso obter os dados com uma ferramenta como curl
. Cada pedaço é JSON válido, mas contém apenas um subconjunto dos dados totais que preciso.
Usando jq
ou não, como posso mesclar os tickets[]
elementos desses blocos de dados paginados novamente em um único documento JSON?
Aqui estão três pedaços de exemplo. Os tickets[]
arrays são bastante editados para esta questão e, na realidade, contêm até 25 entradas, e cada entrada de ticket contém muito mais elementos, incluindo pelo menos alguns arrays.
Exemplo JSON bloco 1 ( part_1.json
)
{
"tickets": [
{
"number": 4445,
"subject": "Your mailbox is almost full"
},
{
"number": 4444,
"subject": "Cannot VPN"
}
],
"meta": {
"total_pages": 3,
"page": 1
}
}
Exemplo JSON bloco 2 ( part_2.json
)
{
"tickets": [
{
"number": 4395,
"subject": "Trados Studio issue"
},
{
"number": 4394,
"subject": "Daily Backup Report(No Errors)"
}
],
"meta": {
"total_pages": 3,
"page": 2
}
}
Exemplo JSON bloco 3 ( part_3.json
)
{
"tickets": [
{
"number": 4341,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4340,
"subject": "Windows Updates on VMs"
}
],
"meta": {
"total_pages": 3,
"page": 3
}
}
Neste caso o resultado esperado seria algo como isto:
{
"tickets": [
{
"number": 4445,
"subject": "Your mailbox is almost full"
},
{
"number": 4444,
"subject": "Cannot VPN"
},
{
"number": 4395,
"subject": "Trados Studio issue"
},
{
"number": 4394,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4341,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4340,
"subject": "Windows Updates on VMs"
}
]
}
A saída também poderia incluir o meta
hash, pois eu simplesmente o ignoraria, e não importaria qual meta.page
valor fosse transportado.
Você pode assumir que tickets[].number
é único e que não precisa preservar nenhuma ordenação nesse tickets[]
nível. Há complexidade suficiente nos dados reais para que eu não queira ter que declarar a estrutura JSON completa em nenhum código resultante.
Esta é minha tentativa atual, mas não sou particularmente forte com jq
. Existe uma maneira melhor - por exemplo, não chamar jq
duas vezes ou ser capaz de generalizar o código para que eu não precise especificar o nome do array de nível superior ( tickets
)?
cat part_{1,2,3}.json | jq '.tickets[]' | jq -n '{ tickets:[ inputs ] }'
Quero gerar uma chave específica de uma lista de hashes como linhas onde cada item externo do array é separado por uma linha vazia. Para ilustrar:
A entrada é:
[
[
{
"visible": true,
"url": "url-1"
},
{
"visible": true
},
{
"visible": false,
"url": "url-2"
}
],
[
{
"visible": true,
"url": "url-a"
},
{
"visible": true,
"url": null
},
{
"visible": false,
"url": "url-b"
}
]
]
A saída esperada é:
url-1
url-2
url-a
url-b
Agora, posso obter a saída que desejo usando o seguinte:
cat input.txt | jq 'walk(if type == "object" then (.url | select( . != null)) end) | .[] | select(length > 0)' | jq 'join("\n")' | jq -rs 'join("\n\n")'
Há dois problemas aqui:
null
) é tudo manipulado pela primeira jq
invocação, então obtemos uma lista de uma lista de stringsMas parece que deve haver uma solução mais fácil para qualquer um desses problemas, especialmente para o segundo.