UNIX-Befehle - finden

UNIX-Befehle - finden

Ich versuche, UNIX-Befehle zu lernen, und spiele dieses Spiel, um zu lernen, und stecke im Moment wirklich fest. Ich bin über SSH auf einem Server und das Verzeichnis ist voller zufälliger Dateien und Ordner und das Passwort für die nächste Ebene befindet sich in einer der Dateien. Mir wurde gesagt, dass die Datei die folgenden Attribute hat:

  • für Menschen lesbar
  • 1033 Byte
  • nicht ausführbar

Ich vermute, dass ich den findBefehl verwenden sollte, und ich habe es versucht, find ! -executableaber es wurden eine Menge Dateien zurückgegeben. Die einzige menschenlesbare Hilfe, die ich im Handbuch oder online finden kann, ist das Ausdrucken der Dateigrößen in menschenlesbarer Sprache. Da bin ich also ein bisschen ratlos?

Ich habe es auch versucht, find ~ -size 1033baber es hat nichts zurückgegeben. Aber als ich find ~ -size -1033bes versucht habe, wurden alle Dateien im Verzeichnis zurückgegeben.

Antwort1

Um die für Menschen lesbaren Dateinamen herauszufiltern, können Sie das [:print:](druckbar)ZeichenklasseName. Mehr zu solchen Klassen finden Sie im Handbuch für grep.

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

Bei näherem Überlegen könnte sich die Anforderung „menschenlesbar“ auf den Inhalt der Datei beziehen, statt auf ihren Namen. Mit anderen Worten, Sie würden suchen nachTextDateien. Das ist etwas kniffliger. Wie @D_Bye in einem Kommentar vorgeschlagen hat, sollten Sie dann den fileBefehl verwenden, um den Dateiinhaltstyp zu bestimmen. Es wäre jedoch keine gute Idee, filenach einer Pipe zu laufen, da dies die Aufgabe der Anzeige des Dateinamens erschweren würde. Folgendes schlage ich vor:

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

So filefunktioniert der -Teil in Kürze:

  • Der-execDas Prädikat wird sh -c 'file -b $0 | grep -q text' FILENAMEfür jedes ausgeführt FILENAME, das alle vorherigen Bedingungen (Typ, Größe, nicht ausführbar) erfüllt.
  • Für jede dieser Dateien shführt eine Shell () diesen kurzenSkript: und durch den Dateinamen file -b $0 | grep -q textersetzen .$0
  • DerfileDas Programm ermittelt den Inhaltstyp jeder Datei und gibt diese Information aus. Die -bOption verhindert, dass der Name jeder getesteten Datei gedruckt wird.
  • grepfiltert die Ausgabe des fileProgramms und sucht nach Zeilen, die enthalten"Text"(Sehen Sie selbst, wie eine typische Ausgabe des fileBefehls aussieht.)
  • Gibt aber grepden gefilterten Text nicht aus, da er den-q(ruhige) Option gegeben. Was es tut, ist nur seineBeendigungsstatusauf entweder 0(was "true" bedeutet - der gefilterte Text wurde gefunden) oder 1 (was "Fehler" bedeutet - der Text"Text"erschien nicht in der Ausgabe von file).
  • Der von stammende True/False-Exit-Status wird an grepweitergegeben und fungiert als Endergebnis des gesamten " "-Tests.shfind-exec sh -c 'file $0 | grep -q text' {} \;
  • Falls der obige Test zurückgegeben wirdWAHR, wird der -printBefehl ausgeführt (d. h. der Name der getesteten Datei wird ausgedruckt).

Antwort2

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

Beachten Sie, dass ich canstelle von bfür die Dateigröße verwendet habe. bgilt für 512-Byte-Blöcke. cgilt für tatsächliche Bytes.

Antwort3

alles was ich geschrieben habe war:

find -size 1033c ! -executable

und habe die Datei bekommen. Offenbar sollte der für Menschen lesbare Teil Sie in die Irre führen.

Antwort4

Ich denke jedoch, dass für das Spiel die korrekte Syntax lautet:

file ./* 

Sie erhalten eine Rückgabe, die auflistet, woraus jede Datei besteht. Das hat für das, was Sie im Bandit-Spiel erreichen möchten, wirklich gut funktioniert. Die wirkliche Herausforderung bei dieser Aufgabe besteht darin, dass jede Datei mit - (Bindestrich) beginnt.

verwandte Informationen