Jak mam globować dla wszystkich ukrytych plików?


22

Chcę wykonać akcję (powiedzmy chown) na wszystkich ukrytych plikach w katalogu.

Wiem, że .*to nie jest dobry pomysł, ponieważ będzie również znaleźć aktualne .i nadrzędnych ..katalogów (wiem, że rmnie będzie w stanie operować .a ..jednak inne polecenia, w tym chowni chmodbędzie szczęśliwie się skuteczna)

Ale wszystkie moje ukryte pliki mają różne nazwy!

Jak mam globować dla wszystkich ukrytych plików, wyłączając .i ..?

Odpowiedzi:


20

Możesz użyć następującego extglobwzoru:

.@(!(.|))
  • .mecze dosłownym .najpierw

  • @()jest extglobwzorem, pasuje do jednego z wzorów w środku, ponieważ mamy tylko jeden wzór w środku, wybierze to

  • !(.|)to kolejny extglobwzorzec (zagnieżdżony), który pasuje do dowolnego pliku bez lub z jednym .; Jak już dopasowaliśmy .na początku, cały ten wzór będzie pasował do wszystkich plików zaczynających się od, z .wyjątkiem .i ...

extglobjest bashdomyślnie włączony w interaktywnych sesjach w Ubuntu. Jeśli nie, włącz najpierw:

shopt -s extglob

Przykład:

$ echo .@(!(.|))
.bar .foo .spam

To zdecydowanie niesamowita rzecz, o której muszę się nauczyć! Dziękujemy za nauczanie
Zanna,

@Zanna Glad mogłem pomóc :)
heemayl

2
Jaki jest cel tego @()? Proste .!(.|)wydaje się działać identycznie.
Kyle Strand,

1
Wiem, że to stare, ale mam takie samo pytanie jak @KyleStrand. W moich testach !(.|)działa tak samo. Czy @()w tym kontekście jest jakiś cel ?
Paddy Landau

Czy huk jest zaprzeczeniem? Nie wspomniano o tym i czytając twoje wyjaśnienie, mam wrażenie, że wzór pasuje do kropki i doubleledot, ale wyraźnie opisujesz pliki, które pasują do początkowej kropki, z wyjątkiem tych dwóch.
użytkownik nieznany

20
 GLOBIGNORE=".:.."

ukryć. i .. katalogi. To także ustawia dotglobopcję: *dopasowuje zarówno ukryte, jak i nie ukryte pliki.

Możesz też zrobić

shopt -s dotglob

Gilles :)


9

Możesz użyć findpolecenia tutaj. Na przykład coś takiego

find -type f -name ".*" -exec chmod 775 {} \;

Znajdzie to ukryte pliki i zmieni uprawnienia


Edytuj, aby dołączyć komentarz @gerrit:

find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;

Spowoduje to ograniczenie wyszukiwania do góry bieżącego katalogu zamiast wyszukiwania rekurencyjnego.


4
Możesz dodać -maxdepth 1tutaj, aby bardziej pasowało do zachowania w pytaniu i innych odpowiedziach.
gerrit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.