Як зіставити * із прихованими файлами всередині каталогу


21

Як зіставити приховані файли всередині даних каталогів

наприклад

Якщо я даю команду нижче, це не дає результату прихованих файлів,

 du -b maybehere*/*

як досягти цього простого за допомогою однієї команди замість використання

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

як мені потрібно вводити десь двічі.


Спробуйте просто приховати maybehere*/.*і додати вище всіх для себе
Costas

1
У вашій редакції виникає нове запитання з додатковими обмеженнями, що перетворює питання Q у рухому ціль, можливо, недійсне відповіді (відповіді), вже задані. Це погані манери, просто задайте нове питання, якщо у вас є таке.
Антон

Відповіді:


22

Скористайтеся розширенням дужок:

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

або альтернативно

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

Логіка цього, мабуть, не очевидна, тому ось пояснення:

  • * відповідає всім не прихованим файлам
  • .[^.]відповідає файлам, імена яких починалися з однієї крапки, а за ними - не крапка; що є лише двома іменами символів у першій формі.
  • .??* відповідає прихованим файлам, що мають принаймні 3 символи
  • ..?* як вище, але другий символ повинен бути крапкою

Вся справа в тому, щоб виключити жорсткі посилання на поточний та батьківський каталог ( .і ..), але включити всі звичайні файли таким чином, що кожен з них буде зарахований лише один раз!

Наприклад, найпростіше було б просто написати

du -b maybehere*/{.,}*

Це означає, що список містить крапку .і "нічого" (нічого не знаходиться між ,і закривається }), таким чином, всі приховані файли (які починаються з крапки) і всі не приховані файли (які починаються з "нічого") не відповідають. Проблема полягає в тому, що це також буде відповідати .і .., і це , швидше за все , не те , що ви хочете, так що ми повинні виключити його як - то.


Заключне слово про розширення дужок.

Розширення дужок - це механізм, за допомогою якого ви можете додавати до командного рядка більше файлів / рядків / що завгодно, записуючи менше символів. Синтаксис є {word1,word2,...}, тобто це список рядків, розділених комами, який починається з {і закінчується с }. bashПосібник дає дуже основний і в той же час дуже поширений приклад використання:

$ echo a{b,c,d}e
abe ace ade

в чому полягає використання цього поняття, якого { }я не маю :( ви можете дати мені
вказівку

@vidhan див. редагування та переглянь man bashрозділ "Розширення дужки ".
jimmij

Ви не хотіли б дати мені більше пояснень для вищезазначених анс, трохи чіткіше пояснюючи, як працює все, як я новачок із цими речами @jimmij
vidhan

6
.??*не відповідає .a, .b... .[^.]*не відповідає ..foo.
Стефан Шазелас

4
.fooвідповідає як .[^.]*і .??*. Ти хочеш {.[!.],..?,}*.
Стефан Шазелас

14

Оскільки ви вже використовуєте специфічний синтаксис GNU ( -b):

du -abd1 maybehere*/

Таким чином, саме вони duперераховують файли в maybehere*каталогах (і це не виключає крапкових файлів). -d1обмежує звітність про використання диска на один рівень вниз (включаючи не-каталоги з -a).

В іншому випадку, щоб глобуси включали приховані файли (крім .і ..), кожна оболонка має свій синтаксис:

  • 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*/*)

    однак, будьте обережні, це включає в себе .і ..системи, що включають їх, у результаті readdir() чого вони навряд чи корисні.


8

Інший варіант доступний тут :

du -sm .[!.]* *

Чому ви хочете пропустити імена файлів, починаючи з ..?
Kusalananda

2
Імовірно, тому що вони не хочуть перераховувати все в ../і нижче.
Шадур

Це не враховує файли, наприклад, наприклад ..myfile; додати ..?*для цього. Але +1 за використання належного глобального синтаксису для негативних збігів.
Педро Гімено

0

Якщо ви хочете просто перелічити приховані каталоги або працювати в прихованих каталогах, тоді, як сказав Костас, ви можете використовувати

du -b maybehere*/.*

Це дозволить працювати з прихованими файлами та каталогами. Якщо ви хочете лише приховані каталоги, ви можете вказати це за допомогою

du -b maybehere*/.*/


Ви можете побачити питання ще раз @SailorCire Я його трохи відредагував
Vidhan

@vidhan, тож ви хочете працювати лише на прихованому всередині одного каталогу? Це правильно?
SailorCire

ні, я хочу відповідати як прихованим, так і не прихованим файлам всередині однієї директорії, замість того, щоб використовувати і du, maybehere*/.*і maybehere*/*один прихований, і інший для не прихованого
vidhan

@vidhan du -bпідбирає і приховані, і не приховані.
SailorCire

ні :( на жаль @SailorCire
vidhan

0

Хоча це не оболонка безпосередньо, ви можете використовувати пошук із обмеженою глибиною, як це

find maybehere -maxdepth 1 -exec du -sh {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.