Proste pytanie, ale nie jestem pewien, gdzie szukać, a Google nie reaguje na kropki i ukośniki.
Po prostu próbuję policzyć # plików i katalogów w bieżącym katalogu (nie licząc podfolderów / plików) i starał się różnicować ls -1 | wc -l
i ls | wc -l
ponieważ wydają identyczne. Witryna, na którą patrzyłem, powiedziała: „Pamiętaj, że to także uwzględnia katalogi ./ i ../”. jeśli chodzi o ten z ls -1
, i nie jestem pewien, czy to oznacza, że zawiera katalogi wcześniej czy coś (czego nie chcę), ale wydaje się, że nie robiło to z testowania.
Czy ktoś mógłby potwierdzić, który z nich byłby najbardziej odpowiedni do zliczania # plików i katalogów tylko w bieżącym katalogu (nie sub) i co rozumieją przez katalogi ./ i ../?
Odpowiedzi:
Każdy katalog w systemie Unix (i prawdopodobnie także każdy inny system) zawiera co najmniej dwie pozycje katalogu. Są to
.
(katalog bieżący) i..
(katalog macierzysty). W przypadku katalogu głównego wskazują one to samo miejsce, ale w każdym innym katalogu są one różne. Można to zobaczyć na własne oczy użyciustat
,pwd
icd
polecenia (w systemie Linux):Uwaga,
bin
isbin
każdy ma dwa linki do niego. Jeden to wpis katalogu w katalogu głównym, a drugi to.
wpis w tym katalogu.Używanie
ls
z potokiem dowc -l
jest prostą sztuczką, aby policzyć liczbę linii na wyjściu ls. Zakłada się, że każdy plik lub katalog zajmie dokładnie jeden wiersz na wyjściu. GNU ls zrobi to, gdy wyjście nie jest terminalem, zrobi to automatycznie; inni mogą potrzebować-1
opcji jawnego włączenia zachowania.wc -l
po prostu zlicza i wypisuje liczbę wierszy (-l
) na wejściu.Problem z tym podejściem polega na tym, że w systemie Linux i systemach plików tradycyjnie używanych w systemie Linux, nazwy plików i katalogów (w tym przypadku są one naprawdę takie same) mogą zawierać znaki nowej linii . W ich obecności jedna z metod się rozpada - wpisy te będą liczone jako dwa lub więcej wpisów, podczas gdy w rzeczywistości są one jednym.
Tak długo, jak używasz GNU ls, nie ma pozycji katalogu z nazwami zawierającymi znaki nowego wiersza i nie ma nieparzystych aliasów dla
ls
(na przykładls -a
), oba będą wyświetlać liczbę plików i katalogów w bieżącym (lub określonym) katalogu. Dla większości ludzi jest to wystarczająco dobre, ale nie jest to poprawne w ogólnym przypadku.Jeśli potrzebujesz poprawnie obsługiwać nietypowe znaki (przede wszystkim znaki nowej linii) w nazwach pozycji katalogu, sugeruję użycie
-b
opcji ls, aby je uciec.ls -1bA
wypisze nazwę każdego wpisu katalogu we własnym wierszu, unikając nietypowych znaków (więc każdy wpis katalogu będzie postrzegany jako jeden), w tym wszelkie pliki-kropkowe i -katalogi. Dołączwc -l
do pełnego wiersza poleceń,ls -1bA | wc -l
który zgłosi liczbę plików i katalogów w bieżącym katalogu (ale zignoruj.
i..
; to różnica między-a
i-A
), ale nie zejdzie do żadnych podkatalogów. Jeśli nie chcesz, aby pliki dot były liczone do sumy, po prostu pomiń-A
parametr dols
.źródło
-a
i-A
zawierać ukryte pliki, a które ja sobie sprawę, chcę uniknąć, więc co najwyżej bym zrobiłals -b | wc -l
, ale to nie daje mi właściwą odpowiedź. Czy wiersz, który kopiuję i wklejam odnośnie tego polecenia jest niepoprawny? Jeśli było to prawidłowe, czy nie powinienem otrzymywać danych wyjściowych o wartości 8, gdy w katalogu znajduje się 6 plików lub folderów?mkdir()
wywołania systemowego. Nie wszystkie systemy plików je mają i nie są nawet potrzebne ani wymagane przez POSIX.Aby odpowiedzieć na pytanie w temacie:
Kiedy katalog B jest tworzony w Uniksie, jest dodawany jako nowy wpis do innego katalogu A (jego katalogu nadrzędnego), aw B dodawane są dwa wpisy: jeden nazywany
.
twardym łączem do siebie, a drugi nazywany..
twardym link do A.Są to jedyne dozwolone twarde linki do katalogów (chociaż niektóre starsze wersje niektórych Uniksów również dopuszczały dowolne linki).
dlatego w większości systemów plików (
btrfs
co jest godnym uwagi wyjątkiem) numerlinks
katalogu wskazuje, ile ma podkatalogów (uwzględniając ich..
wpisy).Gdy zmieniasz nazwę / przenosisz katalog, jeśli znajduje się on w tym samym katalogu (pod inną nazwą),
A
zmieniany jest tylko wpis w nazwie . B.
i..
nie ma to wpływu. Ale jeśli przenieść to zrobić inny katalog, a następnie..
wB
ulegnie zmianie. To wyjaśnia, dlaczego możesz zmienić nazwę katalogu, do którego nie masz dostępu do zapisu (zakładając, że masz dostęp do zapisu do katalogu nadrzędnego) tylko pod warunkiem, że nie przeniesiesz go do innego katalogu (w przeciwnym razie potrzeba zmiany..
wpisu uniemożliwi od przeniesienia go).Uważaj jednak:
/a/b/../c
nie może być taka sama jak/a/c
bo/a/b
może być symboliczny link innego katalogu.Wyjątkiem jest sytuacja, w której ta ścieżka jest podawana do
cd
polecenia dla niektórych powłok. Tecd
s traktować..
logicznie ignorowanie..
wpisów w katalogach. Powód, dla którego często widziszcd -P
poprawnie napisane skrypty, aby wyłączyć tę funkcję, która w przeciwnym razie mogłaby powodować zamieszanie i niespójności.Aby policzyć liczbę wpisów w bieżącym katalogu bez
.
i..
zebash
można zrobić:Z zsh:
Przenośny:
źródło
ls | wc -l
jest to jedyny wykluczający.
i..
ls
nie wyświetla ukrytych plików. Musiszls -A
uzyskać takie same jak te. JEŻELI nie chcesz liczyć ukrytych plików, zdejmijdotglob
(dla bash) lubD
(dla zsh) lub dodaj! -name '.*'
przedtem-print
dlafind
.ls | wc -l
wciąż daje mi właściwą odpowiedź i wyklucza ukryte pliki,.
i..
?.
,..
a inny plik, którego nazwa zaczyna się.
, które nie jest wymienione przez ls ale byłoby zals -A
. Więcls | wc -l
nie daje poprawnej odpowiedzi, ponieważ nie liczy tego ukrytego pliku..
i..
są ukrytymi plikami, ponieważ zaczynają się od.
. Istnieje nawet legenda, która wyjaśnia, że dotfiles ukryte przez przypadek jako wczesne wdrożeniels
miało na celu wykluczenie tylko.
a..
, ale nie był to błąd, który powodował, że aby wykluczyć wszystkie pliki zaczynające się.
.ls | wc -l
nie działa, jeśli nazwy plików zawierają znaki nowego wiersza.Nie jestem świetnym ekspertem od Linuksa, ale znam Linuksa (byłam administratorem 16 lat temu na Slackware :) Dobry stary czas
katalogi ./ i ../ to proste:. jest bieżącym katalogiem, .. jest poprzednim katalogiem (w drzewie pwd -local katalog polecenie-
Jeśli to się liczy, liczę, że dodają 2 do całej listy, tak naprawdę nie przechodzą rekurencyjnie i liczą katalog poniżej bieżącego, a także liczą ponownie bieżący katalog (.) :))
Zasadniczo myślę, że dodaje wartość 2 do liczenia (plików) w bieżącym katalogu.
Niech ktoś mnie poprawi, jeśli się mylę.
Po prostu piszę, aby pomóc i zobaczyłem, że nikt tutaj nie odpowiedział na to pytanie, mogą być zajęci. Ale po prostu eksperymentuj i sprawdź, czy masz 10 plików i uzyskaj liczbę 12, to wszystko.
źródło
ls | wc -1
ls | wc -l
zawiera.
i..
kiedy otrzymuję właściwą odpowiedź, w przeciwieństwie do właściwej odpowiedzi + 2.