Odpowiedzi:
Komenda :
ls -ld .?*
Wyświetla tylko ukryte pliki.
Wyjaśnić :
-l use a long listing format
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
.?* will only state hidden files
.
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 .!(|.)
ls -d .!(|.)
Robi dokładnie to, czego szuka OP.
!(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ć
echo .[^.]*
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
:
find -mindepth 1 -prune -name '.*'
Te -mindepth
, zapewnia, że nie pasują .
i -prune
oznacza, że find
nie będzie zejść do podkatalogów.
Używanie find
i awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Wyjaśnienie:
find . -type f
-> Wyświetl wszystkie pliki w bieżącym katalogu wraz z jego ścieżką, np.
./foo.html
./bar.html
./.foo1
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.
find -type f
. Nie musisz jawnie ustawiać ścieżki wyszukiwania lub -name "*"
.
find
jest zwykle lepszą opcją dla skomplikowanych wyszukiwań niż stosowanie globowania nazw.
find . -mindepth 1 -maxdepth 1 -name '.*'
lub
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
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ą.
if [[ -f .hidden]] # if '.hidden' exists and is a file
then
while read filename # read file name from line
do
if [[ -e "$filename" ]] # if the read file name exists
then
echo "$filename" # print it
fi
done < .hidden # read from .hidden file
fi
.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łoby cat .hidden
? Twoje find
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 | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
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.
find -maxdepth 1 -name ".[!.]*"
ls
powinieneś analizować wyniku .
Co jeszcze mogłeś zrobić, is ls .?*
Lub ls .!(|)
pokaże ci wszystko w bieżącym katalogu ukryte pliki / katalogi na górze i inne pliki / katalogi poniżej
np .: z mojego terminala
$ ls .?*
.bash_history .dmrc .macromedia .weather
.bash_logout .gksu.lock .profile .wgetrc
.bash_profile .bashrc.save .ICEauthority .toprc .Xauthority
.bashrc .lastdir .viminfo .xsession-errors
.bashrc~ .dircolors .lynxrc .vimrc .xsession-errors.old
..:
Baron
.adobe:
Flash_Player
.aptitude:
cache config
.cache:
compizconfig-1 rhythmbox
dconf shotwell
Zauważ teraz w powyższych wynikach, że pokazuje on każdy plik / katalog wraz z jego podkatalogiem oraz wszelkie ukryte pliki poniżej.
[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases .bashrc1 .bashrc1~
..:
askapache-bash-profile.txt examples.desktop Public top-1m.csv
backups Firefox_wallpaper.png PycharmProjects top-1m.csv.zip
Desktop java_error_in_PYCHARM_17581.log Shotwell Import Log.txt topsites.txt
Documents Music Templates Videos
Downloads Pictures texput.log vmware
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.
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:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Wyjaśnienie
Powoduje to wyświetlenie listy wszystkich plików (i katalogów) dwukrotnie,
echo -e "$(\ls)\n$(\ls -A)"
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
.
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 wersjach ls
będą używane ?
znaki specjalne, więc oba .foo\tbar
( \t
=> tab) i .foo\nbar
( \n
=> nowa linia) będą wyświetlane jako foo?bar
).
Możesz także użyć echo .*
na przykład
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
Jeśli wolisz format długiej listy, po prostu zamień białe znaki na nową linię.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
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 :
GLOBIGNORE
Zmiennej powłoki mogą być wykorzystywane do ograniczania zestaw nazwami dopasowania wzorca. JeśliGLOBIGNORE
jest ustawiony, każda pasująca nazwa pliku, która pasuje również do jednego z wzorców,GLOBIGNORE
jest usuwana z listy dopasowań. Jeślinocaseglob
opcja jest ustawiona, dopasowanie do wzorców wGLOBIGNORE
wykonywane jest bez względu na wielkość liter. Nazwy plików.
i..
są zawsze ignorowane, gdyGLOBIGNORE
są ustawione, a nie null. Jednak ustawienieGLOBIGNORE
wartości innej niż null powoduje włączenie opcji powłoki dotglob, więc wszystkie inne nazwy plików zaczynające się od‘.
„będą pasować”.
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:
GLOBIGNORE=.
ls -d .*
ls -ld .*
lubls -ald .*
zadziała