Próbuję nauczyć się komend UNIX i gram w tę grę, aby się uczyć i w tej chwili naprawdę utknąłem. Jestem na serwerze przez ssh, a katalog jest pełen losowych plików i folderów, a hasło do następnego poziomu znajduje się w jednym z plików. Powiedziano mi, że plik ma następujące attrbutes:
- czytelny dla człowieka
- 1033 bajtów
- niewykonywalny
Zgaduję, że powinienem użyć find
polecenia i próbowałem, find ! -executable
ale to zwróciło ładunek plików. Jedyną czytelną dla człowieka pomocą, którą mogę znaleźć w instrukcji lub w Internecie, jest wydrukowanie rozmiarów plików w postaci czytelnej dla człowieka. Więc jestem trochę zagubiony?
Próbowałem też, find ~ -size 1033b
ale to nic nie zwróciło. Ale kiedy próbowałem find ~ -size -1033b
, zwróciło każdy plik w katalogu.
command-line
find
Nick Corin
źródło
źródło
Odpowiedzi:
Aby odfiltrować nazwy plików czytelne dla człowieka, możesz użyć
[:print:]
( klasy drukowalnej ) nazwy klasy znaków . Więcej informacji o takich klasach znajdziesz w instrukcji dlagrep
.Z drugiej strony wymóg „czytelny dla człowieka” może odnosić się do zawartości pliku, a nie jego nazwy. Innymi słowy, szukałbyś plików tekstowych . To trochę trudniejsze. Zgodnie z sugestią @D_Bye w komentarzu, należy użyć
file
polecenia, aby określić typ zawartości pliku. Ale nie byłoby dobrym pomysłem uruchamianiefile
za potokiem, ponieważ skomplikowałoby to zadanie wyświetlania nazwy pliku. Oto, co sugeruję:Oto pokrótce, jak
file
działa -part:-exec
Wykonuje predykatywnychsh -c 'file -b $0 | grep -q text' FILENAME
dla każdegoFILENAME
, które spełnia wszystkie poprzednie warunki (typ, rozmiar, nie wykonywany).sh
) uruchamia ten krótki scenariusz :file -b $0 | grep -q text
, zastępując$0
z nazwy pliku.file
Program określa typ zawartości każdego pliku i wysyła tę informację. Ta-b
opcja uniemożliwia wydrukowanie nazwy każdego testowanego pliku.grep
filtruje wyjście pochodzące zfile
programu, wyszukując wiersze zawierające „tekst” . (Przekonaj się, jak wygląda typowe wyjściefile
polecenia).grep
nie wyświetla przefiltrowanego tekstu, ponieważ ma-q
podaną opcję (cichą). To, co robi, to po prostu zmień status wyjścia na albo0
(co oznacza „prawda” - znaleziono przefiltrowany tekst) lub 1 (co oznacza „błąd” - tekst „tekst” nie pojawił się na wyjściu zfile
).grep
przepuszcza dalejsh
sięfind
i działa jako wynik końcowy całego „-exec sh -c 'file $0 | grep -q text' {} \;
” test.-print
polecenie jest wykonywane (tzn. Wypisywana jest nazwa testowanego pliku).źródło
find . -type f -size 1033c
zwróci również tę samą odpowiedź.Zauważ, że użyłem
c
zamiastb
rozmiaru pliku.b
jest dla 512 bajtów bloków.c
jest dla rzeczywistych bajtów.źródło
-readable
znaczyło to dla człowieka (tzn. Nie binarnie)find
sięfile
.wszystko co napisałem to:
i dostałem plik. Najwyraźniej częścią czytelną dla człowieka było zrzucenie cię.
źródło
źródło
Myślę, że dla gry poprawna składnia to:
Otrzymasz zwrot z listą każdego pliku. Sprawdziło się naprawdę dobrze w przypadku tego, co próbujesz osiągnąć w grze Bandit. Prawdziwa krzywa dla tego zadania polega na tym, że każdy plik zaczyna się od - (łącznika).
źródło
file ./-*
ten sposób.Myślę, że to najlepsza odpowiedź, która spełni wszystkie 3 warunki
Ale jak wiele osób mówiło, pliki wykonywalne i czytelne dla ludzi miały nas zrzucić, więc wykorzystując
wystarczy!
źródło