Ich versuche, UNIX-Befehle zu lernen, und ich spiele dieses Spiel, um zu lernen, und ich stecke im Moment wirklich fest. Ich bin über ssh auf einem Server und das Verzeichnis ist voll mit zufälligen Dateien und Ordnern 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 Bytes
- nicht ausführbar
Ich vermute, dass ich den find
Befehl verwenden sollte und ich habe es versucht, find ! -executable
aber das hat eine Menge Dateien zurückgegeben. Die einzige für Menschen lesbare Hilfe, die ich im Handbuch oder online finden kann, ist das Ausdrucken der Dateigrößen in für Menschen lesbaren. Also bin ich dort ein bisschen verloren?
Auch ich habe es versucht, find ~ -size 1033b
aber das brachte nichts zurück. Aber als ich es versuchte, gab find ~ -size -1033b
es jede Datei im Verzeichnis zurück.
quelle
Antworten:
Um die für Menschen lesbaren Dateinamen herauszufiltern, können Sie den
[:print:]
( druckbaren ) Zeichenklassennamen verwenden. Weitere Informationen zu solchen Klassen finden Sie im Handbuch fürgrep
.Bei einem zweiten Gedanken könnte sich die Anforderung "lesbar" auf den Inhalt der Datei anstatt auf ihren Namen beziehen. Mit anderen Worten, Sie würden nach Textdateien suchen . Das ist etwas kniffliger. Wie in einem Kommentar von @D_Bye vorgeschlagen, sollten Sie dann den
file
Befehl verwenden, um den Dateiinhaltstyp zu bestimmen. Es wäre jedoch keine gute Idee,file
einer Pipe nachzulaufen, da dies die Anzeige des Dateinamens erschweren würde. Folgendes schlage ich vor:So funktioniert der Teil kurz
file
:-exec
Prädikat wirdsh -c 'file -b $0 | grep -q text' FILENAME
für jedes Prädikat ausgeführtFILENAME
, das alle vorherigen Bedingungen erfüllt (Typ, Größe, nicht ausführbar).sh
) dieses kurze Skript aus :file -b $0 | grep -q text
und ersetzt es$0
durch den Dateinamen.file
Programm bestimmt den Inhaltstyp jeder Datei und gibt diese Informationen aus. Die-b
Option verhindert das Drucken des Namens jeder getesteten Datei.grep
filtert die Ausgabe desfile
Programms und sucht nach Zeilen, die "Text" enthalten . (Überzeugen Sie sich selbst, wie eine typische Ausgabe desfile
Befehls aussieht.)grep
nicht ausgibt den gefilterten Text, weil es die hat-q
(leise) Option gegeben. Was es tut, ist einfach seinen Exit-Status in entweder0
(was "wahr" darstellt - der gefilterte Text wurde gefunden) oder 1 (was "Fehler" bedeutet - der Text "Text" wurde in der Ausgabe von nicht angezeigtfile
) zu ändern .grep
wird weitersh
an übergebenfind
und ist das Endergebnis des gesamten "-exec sh -c 'file $0 | grep -q text' {} \;
" -Tests.-print
Befehl ausgeführt (dh der Name der getesteten Datei wird gedruckt).quelle
find . -type f -size 1033c
auch genau die gleiche Antwort zurückgibt.Beachten Sie, dass ich
c
anstelleb
für die Dateigröße verwendet habe.b
ist für 512-Byte-Blöcke.c
ist für tatsächliche Bytes.quelle
-readable
bedeutet menschlich lesbar (dh nicht binär)find
an zurückgegebenen Namen weiterfile
.Alles was ich schrieb war:
und bekam die Datei. Anscheinend war der von Menschen lesbare Teil, dich abzuwerfen.
quelle
quelle
Ich denke für das Spiel ist jedoch die richtige Syntax:
Sie erhalten eine Rückgabe, in der aufgeführt ist, woraus jede Datei besteht. Es hat wirklich gut funktioniert für das, was Sie im Bandit-Spiel erreichen wollen. Der eigentliche Kurvenball für diese Aufgabe ist, dass jede Datei mit - (Bindestrich) beginnt.
quelle
file ./-*
.Ich denke, dies ist die beste tatsächliche Antwort, die alle drei Bedingungen abdecken würde
Aber wie viele Leute sagten, sollten die ausführbaren und von Menschen lesbaren Elemente uns abschrecken, also verwenden
ist ganz ausreichend!
quelle