Estou tentando aprender comandos UNIX e estou jogando este jogo para aprender e estou realmente preso no momento. Estou em um servidor através do ssh e o diretório está cheio de arquivos e pastas aleatórios e a senha para o próximo nível está dentro de um dos arquivos. Foi-me dito que o arquivo tem os seguintes atributos:
- legível por humanos
- 1033 bytes
- não executável
Eu estou supondo que eu deveria usar o find
comando e tentei, find ! -executable
mas isso retornou uma carga de arquivos. A única ajuda legível por humanos que posso encontrar no manual ou online é imprimir os tamanhos dos arquivos em legível por humanos. Então, eu estou um pouco perdido lá?
Também tentei, find ~ -size 1033b
mas isso não retornou nada. Mas quando eu tentei, find ~ -size -1033b
ele retornou todos os arquivos no diretório.
fonte
Respostas:
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 a
file
parte-funciona:-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 alterar 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
find . -type f -size 1033c
também retornará exatamente a mesma resposta.Observe que eu usei em
c
vez dob
tamanho do arquivo.b
é para blocos de 512 bytes.c
é para bytes reais.fonte
-readable
meio legível (ou seja, não binário)find
parafile
.tudo o que escrevi foi:
e peguei o arquivo. Aparentemente, a parte legível para humanos era jogar você fora.
fonte
fonte
Eu acho que para o jogo, no entanto, a sintaxe correta é:
Você recebe um retorno que lista em que consiste cada arquivo. Funcionou muito bem para o que você está tentando realizar no jogo Bandit. A bola curva real para esta tarefa é que cada arquivo começa com - (hífen).
fonte
file ./-*
este.Eu acho que esta é a melhor resposta real que cobriria todas as três condições
Mas, como muitas pessoas disseram, o executável e legível por humanos deveria nos jogar fora, então usar
é o bastante!
fonte