Mam katalog zawierający tysiące plików, niektóre z nich są ukryte.
Polecenie wyświetla ls -a
listę wszystkich plików, w tym ukrytych, ale muszę tylko wyświetlić ukryte pliki.
Jakiego polecenia powinienem użyć?
command-line
ls
nux
źródło
źródło
ls -ld .*
lubls -ald .*
zadziałaOdpowiedzi:
Komenda :
Wyświetla tylko ukryte pliki.
Wyjaśnić :
źródło
.
i..
od meczu. Jednak będzie to również wykluczyć (doskonale prawnych) Single-znakowe nazwy plików, takich jak ukryte.a
,.1
i tak dalej. Być może lepszym rozszerzonym globem byłaby.!(|.)
np. Dosłowna kropka, po której następuje cokolwiek oprócz nic lub innej (pojedynczej) kropki, tj.ls -d .!(|.)
Robi dokładnie to, czego szuka OP.
źródło
!(pattern-list)
,pattern-list
to lista jednego lub więcej wzorców rozdzielonych|
, ale to jest mylące dla mnie, że nie ma żadnego wzoru po lewej stronie|
. Czy możesz mi wyjaśnić tę składnię?.
to po nim (nic lub.
), wyłączając.
siebie i..
.Jeśli chcesz tylko pliki w bieżącym katalogu (bez rekurencji), możesz to zrobić
Spowoduje to wydrukowanie nazw wszystkich plików, których nazwa zaczyna się na
.
a, po których następuje jeden lub więcej znaków niepunktowych. Pamiętaj, że to się nie powiedzie w przypadku plików, których nazwa zaczyna się od kolejnych kropek, więc na przykład....foo
nie będzie wyświetlana.Możesz także użyć
find
:Te
-mindepth
, zapewnia, że nie pasują.
i-prune
oznacza, żefind
nie będzie zejść do podkatalogów.źródło
pracuje dla mnie w Bash.
źródło
.
i..
BashUżywanie
find
iawk
,Wyjaśnienie:
find . -type f
-> Wyświetl wszystkie pliki w bieżącym katalogu wraz z jego ścieżką, np.awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
jako awk separatora pól sprawdza, czy ostatnie pole patrzy kropką, czy nie. Jeśli zaczyna się od kropki, drukuje ostatnie pole odpowiadającej linii.źródło
find -type f
. Nie musisz jawnie ustawiać ścieżki wyszukiwania lub-name "*"
.find
jest zwykle lepszą opcją dla skomplikowanych wyszukiwań niż stosowanie globowania nazw.lub
find .
przeszukuje bieżący katalog-mindepth 1
wyklucza i .. z listy-maxdepth 1
ogranicza wyszukiwanie do bieżącego katalogu-name '.*'
znajdź nazwy plików zaczynające się od kropki-o
lub-name '*~'
znajdź nazwy plików, które kończą się tyldy (zazwyczaj są to pliki kopii zapasowych z programów do edycji tekstu)Jednak w tej i wszystkich innych odpowiedziach brakuje plików znajdujących się w
.hidden
pliku bieżącego katalogu . Jeśli piszesz skrypt, linie te odczytują.hidden
plik i wyświetlają nazwy plików, które istnieją.źródło
.hidden
plik Dlaczego miałby istnieć plik o nazwie.hidden
zawierającej nazwy plików? W każdym razie, jeśli istnieje jedno, dlaczego miałbyś zrobić coś tak złożonego, gdy wszystko, czego potrzebujesz, byłobycat .hidden
? Twojefind
polecenie jest poprawne (ish), ale nie-name '*~'
ma znaczenia. Pliki kończące się tyldami są plikami kopii zapasowych, ale nie są w żaden sposób ukryte..hidden
Plik dotyczy plików i folderów, które chcesz ukryć, gdy nie możesz zmienić nazwy pliku / folderu, tak aby zaczynał się kropką. Jeśli chodzi o pliki kończące się tyldami, zależy to od systemu.ls -B
zignoruje takie pliki, podobnie jak większość eksploratorów plików GUI.cat .hidden
może pokazywać pliki, które już nie istnieją, jeśli pliki te zostały usunięte lub przeniesione od czasu dodania do.hidden
pliku.Myślę, że możesz to zrobić za pomocą następującego polecenia.
ls -a
wprowadzone polecenie, które pokazuje wszystkie pliki i katalogi w bieżącym katalogu roboczym.grep "^\."
Dołączyłem polecenie, które filtruje dane wyjściowe, aby wyświetlać tylko ukryte pliki (jego nazwa zaczyna się od"."
).grep -v "^\.$" | grep -v "^\..$"
Dołączyłem polecenie, które filtruje dane wyjściowe, aby wykluczyć., .. (Są to katalog bieżący i nadrzędny).Jeśli niektóre nazwy plików mogą zawierać więcej niż linię
"\n"
, powyższy przykład może być niepoprawny.Proponuję więc następujące polecenie, aby rozwiązać problem.
źródło
ls
powinieneś analizować wyniku .Co jeszcze mogłeś zrobić,
is ls .?*
Lubls .!(|)
pokaże ci wszystko w bieżącym katalogu ukryte pliki / katalogi na górze i inne pliki / katalogi poniżejnp .: z mojego terminala
Zauważ teraz w powyższych wynikach, że pokazuje on każdy plik / katalog wraz z jego podkatalogiem oraz wszelkie ukryte pliki poniżej.
Przepraszam, nie mogę komentować. wyjaśnić różnicę pomiędzy tu
ls .?*
i @ cioby23 odpowiedźls -d .[!.]* .??*
i dlaczego jest to rzeczywiście drukowania plików ukrytych dwa razy, ponieważ jest dosłownie dwa razy pytasz.??*
,.?*
,.[!.]*
oni to samo, więc dodanie każdy z nich z różnych znaków dowodzenia będzie drukować dwukrotnie.źródło
Możesz także użyć:
Umożliwi to wyświetlanie normalnych ukrytych plików i ukrytych plików, które zaczynają się od 2 lub 3 kropek, na przykład:
..hidden_file
źródło
możesz użyć polecenia
Ma to tę zaletę, że pozwala na wyświetlanie wielu kolumn, w przeciwieństwie do podejścia opartego na grep w
ls -a | grep "^\."
rozwiązaniachźródło
Wszystkie dotychczasowe odpowiedzi oparte są na tym, że pliki (lub katalogi), których nazwy zaczynają się od kropki, są „ukryte”. Wymyśliłem inne rozwiązanie, które może nie być tak wydajne, ale to rozwiązanie nie zakłada nic o nazwach ukrytych plików, a zatem unika wyświetlania
..
w wyniku (podobnie jak obecnie akceptowana odpowiedź).Pełne polecenie to:
Wyjaśnienie
Powoduje to wyświetlenie listy wszystkich plików (i katalogów) dwukrotnie,
ale tylko raz pokazuje ukryte pliki
-A
.Następnie lista jest sortowana,
| sort
co powoduje, że zwykłe (nie ukryte) pliki pojawiają się dwa razy obok siebie.Następnie usuń wszystkie linie, które pojawiają się więcej niż jeden raz
| uniq -u
, pozostawiając tylko unikalne linie.Na koniec użyj
ls
ponownie, aby wyświetlić listę wszystkich plików z niestandardowymi opcjami użytkownika i bez wyświetlania zawartości katalogów na liście-d
.EDYCJA (ograniczenia):
Jak zauważył muru, to rozwiązanie nie będzie działać poprawnie, jeśli istnieją pliki o nazwach takich jak np.
escaped\ncharacter.txt
Ponieważecho -e
podzieli nazwę pliku na dwie linie. Nie będzie również działać zgodnie z oczekiwaniami, jeśli istnieją dwa ukryte pliki o prawie takiej samej nazwie, z wyjątkiem znaków specjalnych, takich jak.foo[tab].txt
i.foo[new-line].txt
ponieważ oba są drukowane jako.foo?.txt
i zostałyby wyeliminowane przezuniq -u
źródło
.
pierwszą postacią...
, ale zastanawiam się, jak dobrze działa z nazwami plików zawierającymi znaki specjalne.echo -e
będą interpretować. Ponadto:ls
nie będzie zmieniać nazw plików, aby dwa różne nazwy plików były wyświetlane tak samo (na przykład w niektórych wersjachls
będą używane?
znaki specjalne, więc oba.foo\tbar
(\t
=> tab) i.foo\nbar
(\n
=> nowa linia) będą wyświetlane jakofoo?bar
).Możesz także użyć
echo .*
na przykład
Jeśli wolisz format długiej listy, po prostu zamień białe znaki na nową linię.
źródło
W przypadku bash ustawienie
GLOBIGNORE
specjalnej zmiennej jest pewne, że niepuste wartości wystarczą, aby ją zignorować.
i..
podczas rozwijania globów. Z dokumentów Bash :Jeśli ustawimy go
.:..
, zarówno.
i..
zostaną zignorowane. Ponieważ ustawienie na cokolwiek innego niż null również spowoduje takie zachowanie, równie dobrze możemy ustawić to na just.
Więc:
źródło