Jak dopasować * do ukrytych plików w katalogu

21

Jak dopasować ukryte pliki w podanych katalogach

na przykład

Jeśli podam poniższe polecenie, nie podaje wyniku ukrytych plików,

 du -b maybehere*/*

jak osiągnąć to proste za pomocą jednego polecenia zamiast użycia

du -b maybehere*/.* maybehere*/*

ponieważ muszę wpisać gdzieś dwa razy.

vidhan
źródło
Spróbuj po prostu ukryć maybehere*/.*i dołączyć do wszystkich dla wszystkich
Costas
1
Twoja edycja tworzy nowe pytanie z dodatkowymi ograniczeniami, które sprawiają, że Q staje się ruchomym celem, co może unieważnić już udzielone odpowiedzi. To złe maniery, po prostu zadaj nowe pytanie, jeśli je masz.
Anthon

Odpowiedzi:

22

Skorzystaj z rozszerzenia nawiasu klamrowego:

du -b maybehere*/{*,.[^.],.??*}

lub alternatywnie

du -b maybehere*/{,.[^.],..?}*

Logika tego prawdopodobnie nie jest oczywista, więc oto wyjaśnienie:

  • * pasuje do wszystkich nie ukrytych plików
  • .[^.]dopasowuje pliki, których nazwy zaczynają się od pojedynczej kropki, po której nie następuje kropka; które są tylko 2 znakowymi nazwami plików w pierwszej formie.
  • .??* dopasowuje ukryte pliki o długości co najmniej 3 znaków
  • ..?* jak wyżej, ale drugi znak musi być kropką

Chodzi o to, aby wykluczyć twarde linki do bieżącego i nadrzędnego katalogu ( .i ..), ale dołączyć wszystkie normalne pliki w taki sposób, aby każdy z nich był policzony tylko raz!

Na przykład najłatwiej byłoby po prostu napisać

du -b maybehere*/{.,}*

Oznacza to, że lista zawiera kropkę .i „nic” (nic nie jest pomiędzy ,i zamykanie }), więc wszystkie pliki ukryte (zaczynające się od kropki) i wszystkie pliki nie ukryte (które zaczynają się od „nic”) byłyby zgodne. Problem polega na tym, że to również pasuje .i .., i najprawdopodobniej nie jest to, czego chcesz, więc musimy jakoś to wykluczyć.


Ostatnie słowo na temat rozszerzenia nawiasu klamrowego.

Rozwijanie nawiasów klamrowych to mechanizm, dzięki któremu możesz dołączyć więcej plików / ciągów znaków / cokolwiek do wiersza poleceń, pisząc mniej znaków. Składnia jest {word1,word2,...}, tzn. Jest to lista ciągów oddzielonych przecinkami, które zaczynają się {i kończą }. bashinstrukcja podaje bardzo prosty, a jednocześnie bardzo powszechny przykład użycia:

$ echo a{b,c,d}e
abe ace ade
jimmij
źródło
jaki jest pożytek z { }Nie mam pojęcia :( czy możesz dać mi kierunek, aby uzyskać więcej informacji na ten temat
vidhan
@vidhan zobacz edycję i spójrz na man bashrozdział „Brace Expansion”.
jimmij
czy mógłbyś podać mi więcej wyjaśnień na powyższe i nieco jaśniej wyjaśniając, jak działa każda rzecz, ponieważ jestem nowy w tych rzeczach @jimmij
vidhan
6
.??*nie pasuje .a, .b... .[^.]*nie pasuje ..foo.
Stéphane Chazelas
4
.foopasuje zarówno do, jak .[^.]*i do .??*. Chcesz {.[!.],..?,}*.
Stéphane Chazelas
14

Ponieważ używasz już składni specyficznej dla GNU ( -b):

du -abd1 maybehere*/

W ten sposób duwyświetla listę plików w maybehere*katalogach (i nie wyklucza plików kropek). -d1ogranicza raportowanie użycia dysku do jednego poziomu w dół (włączając w to nie-katalogi z -a).

W przeciwnym razie, aby globusy zawierały ukryte pliki (oprócz .i ..), każda powłoka ma swoją własną składnię:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    choć uwaga ta obejmuje .i ..na systemach, które je zawierają, w wyniku readdir() czego jest to mało użyteczne.

Stéphane Chazelas
źródło
8

Inna opcja jest dostępna tutaj :

du -sm .[!.]* *
Fábio
źródło
Dlaczego chcesz pominąć nazwy plików zaczynające się od ..?
Kusalananda
2
Prawdopodobnie dlatego, że nie chcą wymieniać wszystkiego na ../dole i na dole.
Shadur,
To się nie liczy plików, takich jak np ..myfile; dodaj ..?*do tego. Ale +1 za użycie właściwej składni globalnej dla dopasowań negatywnych.
Pedro Gimeno
0

Jeśli chcesz po prostu wyświetlić listę ukrytych katalogów lub operować na ukrytych katalogach, to jak powiedział Costas, możesz użyć

du -b maybehere*/.*

To pozwoli ci operować ukrytymi plikami i katalogami. Jeśli chcesz tylko ukryte katalogi, możesz to określić za pomocą

du -b maybehere*/.*/

SailorCire
źródło
czy możesz zobaczyć pytanie jeszcze raz @SailorCire Trochę go edytowałem
vidhan
@vidhan, więc chcesz pracować tylko ukryty w jednym katalogu? Czy to jest poprawne?
SailorCire
nie Chcę dopasować zarówno ukryte, jak i nie ukryte pliki w jednym katalogu zamiast używać zarówno du, jak maybehere*/.*i maybehere*/*jednego ukrytego, a drugiego w przypadku ukrytego
vidhan
@vidhan du -bodbiera zarówno ukryte, jak i ukryte.
SailorCire
nie :( niestety @SailorCire
vidhan
0

Chociaż nie jest to powłoka bezpośrednio, możesz użyć find z ograniczoną głębokością w ten sposób

find maybehere -maxdepth 1 -exec du -sh {} \;
k3a
źródło