Estou tentando encontrar uma maneira eficiente de fazer o nível 5 do desafio de bandidos do OverTheWire .
De qualquer forma, tenho vários arquivos e há apenas um que respeita os seguintes critérios:
- Legível por humanos
- 1033 bytes de tamanho
- Não executável
No momento, estou usando o find
comando e posso encontrar os arquivos que correspondem aos 2 últimos critérios:
find . -size 1033c ! -executable
No entanto, não sei como excluir arquivos não legíveis por humanos. As soluções que encontrei para esse desafio usam o -readable
parâmetro test, mas não acho que isso funcione. -readable
apenas analisa as permissões dos arquivos, e não seu conteúdo, enquanto a descrição do desafio solicita um arquivo ASCII ou algo assim.
Respostas:
Sim, você pode usar
find
para procurar arquivos não executáveis do tamanho certo e depois usarfile
para procurar por ASCII. Algo como:A questão, no entanto, não é tão simples quanto parece. 'Legível por humanos' é um termo terrivelmente vago. Presumivelmente, você quer dizer texto. OK, mas que tipo de texto? Somente caracteres ASCII em latim? Unicode completo? Por exemplo, considere estes três arquivos:
Estes são todos textos e legíveis por humanos. Agora, vamos ver o que
file
faz deles:Portanto, o
find
comando acima encontrará apenasfile1
(pelo bem deste exemplo, vamos imaginar que esses arquivos tenham 1033 caracteres). Você pode expandir ofind
para procurar a sequênciatext
:Com o
-w
,grep
imprimirá apenas as linhas ondetext
for encontrada como uma palavra autônoma. Isso deve estar bem próximo do que você deseja, mas não posso garantir que não exista outro tipo de arquivo cuja descrição também inclua a stringtext
.fonte
Embora
-exec
seja usado principalmente para fazer algo com os arquivos encontrados, também pode funcionar como um teste. Portanto, podemos adicioná-lo aos seus outros critérios:Lembre-se de
grep
retornar um valor diferente de zero quando o padrão não foi encontrado esh -c "COMMAND"
retornará o resultado da avaliação (desde que válido). Portanto, isso imprimirá apenas arquivos ondefile <filename>
cospe algo que termine comtext
, por exemplo, "texto UTF-8 Unicode" ou "texto ASCII", mas não "texto ASCII estendido não ISO, com seqüências de escape".Em uma única linha, ele acaba sendo mais curto do que passar por cima
xargs
:Lembre-se de que você pode substituir
sh -c 'file {} | grep "text$"'
por qualquer comando personalizado. Se você deseja procurar algo muito complexo, pode ser uma idéia melhor fornecer um script de shell e usá-lo:que, a longo prazo, é mais fácil de manter do que o histórico do seu shell:
fonte
text$
excluirá coisas reconhecidas como scripts de shell. Qualquer coisa com um shebang é identificada como um script e é perfeitamente legível por humanos.fonte
Você só precisa usar:
Ele fornecerá o único arquivo que contém a senha.
fonte
Basta executar o seguinte no conteúdo do diretório:
fonte
Por favor, tente este comando combinado. funciona na minha estação.
fonte
Você pode tentar isso
Seu desafio não permite
grep
. arquivo de senha será relatado como "texto ASCII, com linhas muito longas"fonte
Para filtrar os nomes de arquivos legíveis por humanos, você pode usar o nome da classe de caracteres
[:print:]
( imprimível ) . Você encontrará mais sobre essas aulas no manual para .grep
Pensando bem, o requisito "legível por humanos" pode se referir ao conteúdo do arquivo, em vez de seu nome. Em outras palavras, você procuraria por arquivos de texto . Isso é um pouco mais complicado. Como o @D_Bye sugeriu em um comentário, você deve usar o
file
comando para determinar o tipo de conteúdo do arquivo. Mas não seria uma boa ideia correrfile
atrás de um canal, porque complicaria a tarefa de exibir o nome do arquivo. Aqui está o que eu sugiro:É assim que
file
funciona a parte -part:-exec
predicado é executadosh -c 'file -b $0 | grep -q text' FILENAME
para cada umFILENAME
que satisfaça todas as condições anteriores (tipo, tamanho, não executável).sh
) é executado este pequeno roteiro :file -b $0 | grep -q text
, substituindo$0
com o nome do arquivo.file
programa determina o tipo de conteúdo de cada arquivo e gera essas informações. A-b
opção impede a impressão do nome de cada arquivo testado.grep
filtra a saída proveniente dofile
programa, procurando linhas contendo "texto" . (Veja você mesmo como é uma saída típica dofile
comando.)grep
não gera o texto filtrado, porque ele tem a-q
opção (silenciosa) fornecida. O que ele faz é apenas mudar seu status de saída para0
(que representa "true" - o texto filtrado foi encontrado) ou 1 (significando "error" - o texto "text" não apareceu na saída defile
).grep
é passado adiantesh
parafind
e age como o resultado final de todo o-exec sh -c 'file $0 | grep -q text' {} \;
teste.-print
comando é executado (ou seja, o nome do arquivo testado é impresso).fonte
fonte
você receberá o arquivo do exercício
fonte
Ventilador de um forro
fonte
receberá seu resultado
fonte