
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 find
Befehl verwenden sollte, und ich habe es versucht, find ! -executable
aber 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 1033b
aber es hat nichts zurückgegeben. Aber als ich find ~ -size -1033b
es 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 file
Befehl verwenden, um den Dateiinhaltstyp zu bestimmen. Es wäre jedoch keine gute Idee, file
nach 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 file
funktioniert der -Teil in Kürze:
- Der
-exec
Das Prädikat wirdsh -c 'file -b $0 | grep -q text' FILENAME
für jedes ausgeführtFILENAME
, das alle vorherigen Bedingungen (Typ, Größe, nicht ausführbar) erfüllt. - Für jede dieser Dateien
sh
führt eine Shell () diesen kurzenSkript: und durch den Dateinamenfile -b $0 | grep -q text
ersetzen .$0
- Der
file
Das Programm ermittelt den Inhaltstyp jeder Datei und gibt diese Information aus. Die-b
Option verhindert, dass der Name jeder getesteten Datei gedruckt wird. grep
filtert die Ausgabe desfile
Programms und sucht nach Zeilen, die enthalten"Text"(Sehen Sie selbst, wie eine typische Ausgabe desfile
Befehls aussieht.)- Gibt aber
grep
den gefilterten Text nicht aus, da er den-q
(ruhige) Option gegeben. Was es tut, ist nur seineBeendigungsstatusauf entweder0
(was "true" bedeutet - der gefilterte Text wurde gefunden) oder 1 (was "Fehler" bedeutet - der Text"Text"erschien nicht in der Ausgabe vonfile
). - Der von stammende True/False-Exit-Status wird an
grep
weitergegeben und fungiert als Endergebnis des gesamten " "-Tests.sh
find
-exec sh -c 'file $0 | grep -q text' {} \;
- Falls der obige Test zurückgegeben wirdWAHR, wird der
-print
Befehl ausgeführt (d. h. der Name der getesteten Datei wird ausgedruckt).
Antwort2
find . -type f -readable -size 1033c ! -executable
Beachten Sie, dass ich c
anstelle von b
für die Dateigröße verwendet habe. b
gilt für 512-Byte-Blöcke. c
gilt 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.