Команды UNIX - найти

Команды UNIX - найти

Я пытаюсь изучить команды UNIX и играю в эту игру, чтобы учиться, и я действительно застрял в данный момент. Я нахожусь на сервере через ssh, и каталог полон случайных файлов и папок, а пароль для следующего уровня находится внутри одного из файлов. Мне сказали, что файл имеет следующие атрибуты:

  • человек читаемый
  • 1033 байта
  • неисполняемый

Я предполагаю, что мне следует использовать команду find, и я пробовал, find ! -executableно она вернула кучу файлов. Единственная человекочитаемая помощь, которую я смог найти в руководстве или онлайн, — это распечатка размеров файлов в человекочитаемом виде. Так что я немного запутался?

Я тоже пробовал, find ~ -size 1033bно это ничего не дало. Но когда я попробовал, find ~ -size -1033bон вернул все файлы в каталоге.

решение1

Чтобы отфильтровать понятные человеку имена файлов, можно использовать [:print:](печатный)класс персонажаимя. Подробнее о таких классах вы найдете в руководстве по grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

Если подумать, требование "человекочитаемости" может относиться к содержимому файла, а не к его имени. Другими словами, вы будете искатьтекстfiles. Это немного сложнее. Как предложил @D_Bye в комментарии, вам следует использовать команду fileдля определения типа содержимого файла. Но было бы не очень хорошей идеей бежать fileза конвейером, потому что это усложнит задачу отображения имени файла. Вот что я предлагаю:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

Вот как вкратце fileработает эта часть:

  • The-execпредикат выполняется sh -c 'file -b $0 | grep -q text' FILENAMEдля каждого FILENAME, который удовлетворяет всем предыдущим условиям (тип, размер, неисполняемость).
  • Для каждого из этих файлов оболочка ( sh) запускает эту короткую командусценарий: file -b $0 | grep -q text, заменив $0на имя файла.
  • ThefileПрограмма определяет тип содержимого каждого файла и выводит эту информацию. Опция -bпредотвращает печать имени каждого протестированного файла.
  • grepфильтрует вывод fileпрограммы, ища строки, содержащие"текст". (Посмотрите сами, как fileвыглядит типичный вывод команды.)
  • Но grepне выводит отфильтрованный текст, так как он имеет-q(тихий) вариант дан. Что он делает, это просто меняет егостатус выходалибо 0(что означает «истина» — отфильтрованный текст был найден), либо 1 (что означает «ошибка» — текст"текст"не появился в выводе file).
  • Исходный статус выхода true/false grepпередается далее по shадресу findи выступает в качестве окончательного результата всего -exec sh -c 'file $0 | grep -q text' {} \;теста " ".
  • В случае, если вышеуказанный тест вернулистинный, -printкоманда выполняется (т.е. выводится имя тестируемого файла).

решение2

find . -type f -readable -size 1033c ! -executable

Обратите внимание, что я использовал cвместо bдля размера файла. b— для блоков по 512 байт. c— для фактических байт.

решение3

все, что я написал, было:

find -size 1033c ! -executable

и получил файл. Видимо, человекочитаемая часть была нужна, чтобы сбить вас с толку.

решение4

Однако я думаю, что для игры правильный синтаксис такой:

file ./* 

Вы получаете ответ, в котором перечислено, из чего состоит каждый файл. Это действительно хорошо сработало для того, чего вы пытаетесь достичь в игре Bandit. Настоящая загвоздка в этой задаче в том, что каждый файл начинается с - (дефис).

Связанный контент