Oto uproszczona wersja z rozszerzonym wyjaśnieniem dla początkujących, takich jak ja, którzy próbują nauczyć się umieszczać więcej niż jedno polecenie w jednej linii.
Gdybyś miał opisać problem w krokach, wyglądałoby to tak:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Aby to osiągnąć, możemy użyć trzech poleceń UNIX: find
, file
, i grep
.
find
sprawdzi każdy plik w katalogu.
file
poda nam typ pliku. W naszym przypadku szukamy zwrotu „tekstu ASCII”
grep
będzie szukać słowa kluczowego „ASCII” w danych wyjściowych z file
Jak więc możemy połączyć je w jedną linię? Jest na to wiele sposobów, ale uważam, że robienie tego w kolejności naszego pseudokodu ma największy sens (szczególnie dla początkującego, takiego jak ja).
find ./ -exec file {} ";" | grep 'ASCII'
Wygląda na skomplikowane, ale nieźle, kiedy to rozbijemy:
find ./
= przejrzyj każdy plik w tym katalogu. W find
komenda odchodzący nazwa pliku z dowolnego pliku, który pasuje do „wyrażenia” lub cokolwiek przyjdzie po ścieżce, która w naszym przypadku jest bieżący katalog lub./
Najważniejszą rzeczą do zrozumienia jest to, że wszystko po tym pierwszym bicie zostanie ocenione jako Prawda lub Fałsz. Jeśli prawda, nazwa pliku zostanie wydrukowana. Jeśli nie, to polecenie przechodzi dalej.
-exec
= ta flaga jest opcją w poleceniu find, która pozwala nam użyć wyniku innego polecenia jako wyrażenia wyszukiwania. To jak wywołanie funkcji w funkcji.
file {}
= polecenie wywoływane wewnątrz find
. file
Polecenie zwraca ciąg znaków, który powie Ci filetype pliku. Regularnie, to będzie wyglądać następująco: file mytextfile.txt
. W naszym przypadku chcemy, aby używał dowolnego pliku przeglądanego przez find
polecenie, więc wstawiamy nawiasy klamrowe, {}
aby działały jako pusta zmienna lub parametr. Innymi słowy, po prostu prosimy system o wypisanie ciągu dla każdego pliku w katalogu.
";"
= jest to wymagane przez find
i jest znakiem interpunkcyjnym na końcu naszego -exec
polecenia. Jeśli potrzebujesz więcej wyjaśnień, skorzystaj z instrukcji „znajdź” man find
.
| grep 'ASCII'
= |
jest rurą. Potok pobiera dane wyjściowe z tego, co jest po lewej stronie i używa ich jako danych wejściowych dla tego, co jest po prawej stronie. Pobiera dane wyjściowe find
polecenia (ciąg, który jest typem pliku pojedynczego pliku) i testuje je, aby sprawdzić, czy zawiera ciąg 'ASCII'
. Jeśli tak, zwraca prawdę.
TERAZ, wyrażenie po prawej find ./
stronie zwróci wartość true, gdy grep
polecenie zwróci wartość true. Voila.
find . -type f -exec grep -Il "" {} \;
.